java aes密钥生成_如何在Java(Android)中生成与.Net中相同的AES密钥?
我需要從.Net WebService提供的salt和密碼生成
Java(
Android)中的AES密鑰.我需要使用與.net生成的密鑰相同的密鑰和相同的密碼和鹽(使用Rfc2898DeriveBytes和AesManaged()).
這是Android中的代碼:
char[] passwordAsCharArray = password.toCharArray();
PBEKeySpec pbeKeySpec = new PBEKeySpec(passwordAsCharArray, salt, 1000, 256);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
SecretKeySpec secretKey = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
這是.net中的代碼:
byte[] keyBytes = Encoding.Unicode.GetBytes(key);
Rfc2898DeriveBytes derivedKey = new Rfc2898DeriveBytes(key, keyBytes);
AesManaged rijndaelCSP = new AesManaged();
rijndaelCSP.BlockSize = 128;
rijndaelCSP.KeySize = 256;
rijndaelCSP.Key = derivedKey.GetBytes(rijndaelCSP.KeySize / 8);
rijndaelCSP.IV = derivedKey.GetBytes(rijndaelCSP.BlockSize / 8);
ICryptoTransform decryptor = rijndaelCSP.CreateDecryptor();
當我比較兩個鍵時,它們是不同的.任何想法如何在Android上生成與.Net相同的密鑰? (我知道.net中生成的密鑰是正確的).
.Net中的迭代次數為1000,salt和密碼也與Android中的相同.
好吧,事實證明我不需要完全相同的密鑰(作為字節數組).我需要這個來解密已經在.Net中加密的文件(用Java) – 用這個鍵它給我帶來Bad Padding Exception所以我認為密鑰是不同的并且導致了問題,但我需要做的就是生成IV就像一把鑰匙 – 解決了我的問題.謝謝你的回復!
最佳答案 看起來您在.NET代碼中使用“密鑰”(應該是密碼)作為salt,而Java部分使用指定的salt.此外,您指定了用于解碼salt的Unicode字符集,這很奇怪,salt應該是從頭開始的隨機八位字節字符串(== byte array).
我建議您首先將密碼和隨機鹽轉換為字節數組,使用十六進制表示(在控制臺上或在調試器中)進行比較,然后將它們用作每個中的PBKDF2函數的輸入參數.我建議您輸入UTF-8編碼作為密碼.
始終在加密中指定所有參數,盡量不要使用默認值,例如用于迭代計數.如果您的輸入由一位關閉,則輸出將完全不正確,并且無法確定哪個參數負責.
看起來Java和.NET PBKDF2“原語”在兩個平臺上是相同的,互聯網上有工作代碼.
總結
以上是生活随笔為你收集整理的java aes密钥生成_如何在Java(Android)中生成与.Net中相同的AES密钥?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android arcgis 绘制圆_A
- 下一篇: java 证书管理系统_JAVA基础应用