2011-11-28 156 views
0

以下java代碼嘗試解密用C#代碼加密的QR碼中編碼的字符串。它似乎無法解密字符串。有沒有這樣做的簡單方法?Java使用預定義的128位密鑰進行AES加密和解密

//string encrypted contains the string of the encoded characters. 

    String encrypted = intent.getStringExtra("SCAN_RESULT"); 

    //converting the string into a byte array   
    byte[] byteEncrypted = encrypted.getBytes(); 

    //instantiating the AES cipher object 
    Cipher cipher = Cipher.getInstance("AES"); 

    //Predefined public-key 

    byte[] skey = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; 

    //creating a secretKeySpec  
    SecretKeySpec skeyspec = new SecretKeySpec(skey, "AES"); 

//initializing the cipher to Decrypt    
    cipher.init(Cipher.DECRYPT_MODE, skeyspec); 
    final byte[] decrypt = cipher.doFinal(byteEncrypted); 

//decrypting the string     
String contents = new String(decrypt, "UTF-8"); 
+0

找出C#代碼究竟是怎麼加密和結果編碼爲QR碼。沒有這個,只有瘋狂的猜測。 –

+0

我刪除了公鑰加密標籤,因爲我沒有看到這個問題與公鑰加密有什麼關係,儘管代碼中有評論。 – Fantius

回答

1

對於初學者來說,你一般不能轉換存儲爲文本的密文,並直接向getBytes()通話將其轉換爲字節。

AES密文包含值爲0到255的字節;我知道沒有將所有256個值映射到字符的字符集編碼,即使有,也不可能是您的平臺默認編碼,並且您在文本到字節轉換中沒有指定它。

密文最常用的字節到文本轉換是Base-64編碼。如果這就是你在這裏使用的,你將不得不尋找或編寫一個base-64解碼工具。

您還應該在創建Cipher實例時指定完整的轉換;否則,將使用提供程序特定的默認值,這可能與發件人的選擇不匹配。

既然你沒有顯示任何IV,你可能會使用ECB作爲模式。對於大多數消息來說,這是不安全的。如果你的消息是一個很大的隨機數(比如會話標識符),它只能是安全的。

最有可能的填充是PKCS#5填充(在.NET中稱爲PKCS7Padding),但您可能沒有填充或某種自釀填充算法。

假設歐洲央行和PKCS#5填充,你的密碼創作應該是這樣的:

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
相關問題