2012-11-06 35 views
8

Tôi đang cố gắng mã hóa/giải mã một chuỗi trong Java. Không có vấn đề liên quan đến việc mã hóa sau đó được lưu trữ trong một bảng sqlite. Nhưng tôi luôn luôn nhận được lỗi tương tự cố gắng để giải mã nó:Lỗi giải mã trong java

"java.security.InvalidKeyException: không có bộ IV khi ai ngờ"

Dưới đây là đoạn mã của tôi:

public String encrypt(String password){ 
    try 
    { 
     String key = "mysecretpassword"; 
     SecretKeySpec keySpec = null; 
     keySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES"); 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, keySpec); 
     return new String(cipher.doFinal(password.getBytes())); 
    } 
    catch (Exception e) 
    { 
     return null; 
    } 
} 

public String decrypt(String password){ 
    try 
    { 
     String key = "mysecretpassword"; 
     SecretKeySpec keySpec = null; 
     keySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES"); 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 
     cipher.init(Cipher.DECRYPT_MODE,keySpec); 
     return new String(cipher.doFinal(password.getBytes())); 
    } 
    catch (Exception e) 
    { 
     System.out.println(e); 
     return null; 
    } 
} 

Tôi gì làm sai?

+0

Có cùng một vấn đề, không hiểu, tại sao nó hoạt động trên mã hóa và không thành công khi giải mã? trừ khi không thiết lập IV trong mã hóa một mã ngẫu nhiên được tạo ra? – scottyab

+0

Chỉ cần theo dõi nhận xét trước của tôi. Có, bạn cần phải thiết lập một IV tương tự như cách @Udo đã hiển thị dưới đây. – scottyab

+0

Có thể trùng lặp với [Lỗi giải mã: "không có bộ iv khi được mong đợi"] (http://stackoverflow.com/questions/11503157/decrypting-error-no-iv-set-when-one-expected) – rds

Trả lời

9

Bạn sẽ cần phải xác định một vector khởi tạo trong cipher.init() phương pháp:

IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); 
cipher.init(Cipher.DECRYPT_MODE,keySpec, ivSpec); 

Xem: http://docs.oracle.com/javase/1.5.0/docs/api/javax/crypto/spec/IvParameterSpec.html

Vectơ khởi tạo phải là một mảng byte ngẫu nhiên, để thảo luận, hãy xem:

http://en.wikipedia.org/wiki/Initialization_vector

+0

Cảm ơn! Tài liệu và đoạn trích của bạn rất hữu ích! – MademoiselleLenore

+0

ivBytes nên là gì? – sajattack

+0

Tôi đã thêm một số thông tin cho IV vào câu trả lời. –

1

Bạn cần một mã khóa AES thích hợp, hãy thử với:

String key = "mysecretpassword"; 
KeySpec spec = new PBEKeySpec(key.toCharArray(), Salt, 12345678,256); 
SecretKey encriptionKey = factory.generateSecret(spec); 
Key encriptionKey = new SecretKeySpec(encriptionKey.getEncoded(), "AES"); 
+0

encryptKey được chỉ định hai lần. Điều đó có vẻ không đúng ... – PearsonArtPhoto