2012-10-09 97 views
3

我想使用192位密鑰加密數據。Android AES crypt 192bit密鑰

SecretKeySpec key = new SecretKeySpec(new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, "AES/CBC/NoPadding"); 
byte[] data = new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 
byte[] encrypted = null; 
try { 
    Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); 
    cipher.init(Cipher.ENCRYPT_MODE, key); 
    encrypted = cipher.doFinal(data); 
} catch (Exception e) { 
    System.out.println(e.getMessage()); 
} 

但加密是不正確的。而且每次數組的內容都不一樣。爲什麼?

+2

您對「不正確」是什麼意思? –

+1

您如何初始化您的KeyGenerator? –

+0

>>你的意思是「不正確」 加密結果與C++中的加密結果不同 >>你如何初始化你的KeyGenerator? 我沒有生成密鑰。 –

回答

1

您正在使用CBC模式,它需要一個初始化向量(IV)。由於您沒有明確設置,每次加密時都會生成隨機數。你必須要麼:

  • 使用靜態IV(不推薦),或
  • 與密文的C++程序

下面是如何設置的IV一起發送IV Java,對於C++,請參閱您正在使用的庫的文檔:

byte[] iv = generateIv(cipher.getBlockSize()); 
IvParameterSpec ivParams = new IvParameterSpec(iv); 
cipher.init(Cipher.ENCRYPT_MODE, key, ivParams);