2012-02-27 16 views
0

私は今 異なるプログラムで同じ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) 

どうしたらいいですか?

+1

を失敗した場合、私はあなたがJavaがどのように動作するかの基本的な誤解を持っている疑いはBouncyCastleプロバイダを使用して試みることができます。プログラムが終了しても、Javaプログラムの中には何も残っていません。別のプログラムやプログラムの別のインスタンスによって使用されなければならない情報を永続化するために、明示的に指定する必要があります。 IVの場合、これを行うための通常の正しい方法は、IVを* cipher *に付加し、暗号化プログラムがこのIVを暗号から取得するようにすることです。 –

答えて

1

正確な同じマシンですか? 正確なのJVMを使用していることが確実ですか?正しいJCEがインストールされていますか?作業プログラムにブレークポイントを設定し、JCEプロバイダがcom.sun.cryptoプロバイダであることを確認できますか?おそらくあなたは、他のすべてが

import org.bouncycastle.jce.provider.BouncyCastleProvider; 
... 
static { 
Security.addProvider(new BouncyCastleProvider()); 
} 

http://www.bouncycastle.org/wiki/display/JA1/Provider+Installation

+1

別のプロバイダをインストールしても、プログラミングのバグは修正されません。 –

+0

私は暗号化プロバイダのバグでない限り、Gregに同意します。幽霊の問題を追いかけるときに石を打たずに残しておくのは良いことです。より多くの情報や別のエラーメッセージがあなたの本当の問題を解決するのに役立つでしょう:) –