私は今 異なるプログラムで同じIvParameterSpecオブジェクトを使用する方法は?
import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.*;
public class AES
{
public byte[] encrypted;
public byte[] original;
public String originalString,ske;
Cipher cipher;
SecretKeySpec skeySpec;
static IvParameterSpec spec;
byte [] iv;
/*public static String asHex (byte buf[])
{
StringBuffer strbuf = new StringBuffer(buf.length * 2);
int i;
for (i = 0; i < buf.length; i++) {
if (((int) buf[i] & 0xff) < 0x10)
strbuf.append("0");
strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
}
return strbuf.toString();
}*/
public AES()
{
try
{
String key ="chetan";
skeySpec = new SecretKeySpec(getMD5(key),"AES");
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
}
catch(Exception ex)
{ex.printStackTrace();}
}
private static byte[] getMD5(String input){
try{
byte[] bytesOfMessage = input.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
return md.digest(bytesOfMessage);
} catch (Exception e){
return null;
}
}
public String AESencryptalgo(byte[] text)
{
String newtext="";
try
{
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
AlgorithmParameters param = cipher.getParameters();
IvParameterSpec ivspec=param.getParameterSpec(IvParameterSpec.class);
iv=ivspec.getIV();
spec=new IvParameterSpec(iv);
//AlgorithmParameters params = cipher.getParameters();
//iv = params.getParameterSpec(IvParameterSpec.class).getIV();
encrypted = cipher.doFinal(text);
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
newtext=new String(encrypted);
//System.out.println("ENCRYPTED "+newtext);
return newtext;
}
}
public String AESdecryptalgo(byte[] text)
{
try
{
cipher.init(Cipher.DECRYPT_MODE, skeySpec ,spec);
original = cipher.doFinal(text); //Exception occurs here
originalString = new String(original);
return originalString;
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
return originalString;
}
}
暗号
のJavaのコードを次のようしている問題であること、それが正常に暗号化し、別のプログラムで暗号化しながら、私はスペック変数を使用したいときには、私は別のプログラムでは、このスペックを使用して同じデータを復号化するとき次のエラーとスタックトレースを返します。java.security.InvalidAlgorithmParameterException: Parameters missing
at com.sun.crypto.provider.SunJCE_f.a(DashoA13*..)
at com.sun.crypto.provider.AESCipher.engineInit(DashoA13*..)
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at AES.AESdecryptalgo(AES.java:81)
at DatabaseClass.InstRecord(DatabaseCLass.java:230)
どうしたらいいですか?
を失敗した場合、私はあなたがJavaがどのように動作するかの基本的な誤解を持っている疑いはBouncyCastleプロバイダを使用して試みることができます。プログラムが終了しても、Javaプログラムの中には何も残っていません。別のプログラムやプログラムの別のインスタンスによって使用されなければならない情報を永続化するために、明示的に指定する必要があります。 IVの場合、これを行うための通常の正しい方法は、IVを* cipher *に付加し、暗号化プログラムがこのIVを暗号から取得するようにすることです。 –