java - 如何在 Java(Android) 中生成与 .Net 中相同的 AES key ?

标签 java android .net encryption aes

我需要根据 .Net WebService 提供的盐和密码在 Java (Android) 中生成 AES key 。我需要使用与 .net 中生成的 key 相同的 key ,并使用相同的密码和盐(使用 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 中相同的 key 的任何想法? (我知道在 .net 中生成的 key 是正确的)。 .Net中迭代次数为1000次,salt和password也与Android相同。


好的,事实证明我不需要完全相同的键(作为字节数组)。我需要这个来解密一个在 .Net 中加密的文件(在 Java 中) - 使用这个 key 它给了我 Bad Padding Exception 所以我认为 key 是不同的并且导致了问题,但我需要做的就是生成IV 就像一把 key - 解决了我的问题。感谢回复!

最佳答案

看起来您在 .NET 代码中使用“ key ”(应该是密码)作为盐,而 Java 部分使用指定的盐。此外,您指定了用于解码盐的 Unicode 字符集,这很奇怪,盐从一开始就应该是一个随机八位字节字符串(== 字节数组)。

我建议您首先将密码和随机盐转换为字节数组,使用十六进制表示法(在您的控制台或调试器中)比较两者,然后才将它们用作每个 PBKDF2 函数的输入参数。我建议您的密码使用 UTF-8 编码。

始终指定密码学中的所有参数,尽量不要使用默认值,例如对于迭代计数。如果您的输入有一点偏差,输出将完全不正确,并且无法判断是哪个参数造成的。

看起来 Java 和 .NET PBKDF2“原语”在两个平台上是相同的,互联网上有工作代码。

关于java - 如何在 Java(Android) 中生成与 .Net 中相同的 AES key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14358754/

相关文章:

java - 构建项目 spring org.springframework.beans.factory.UnsatisfiedDependencyException 时出错

java - 在 GWT DisclosurePanel 标题中的小部件之一上设置自定义 onClick

android - 房间 - 使用@get :Query instead @Query

c# - 对齐报告中的文本

.net - 属性 setter 中 Interlocked.Exchange 的简写

java - 如何解决Spring上下文的循环依赖?

android - 如果在 CoordinatorLayout 中设置了 anchorView,则 float 操作按钮不与 Snackbar 一起 float

android - 错误 :Failed to open zip file. Gradle 的依赖缓存可能已损坏

.net - 可以在 Visual Studio C++ 2008 中制作一个不使用 .NET 框架的程序吗?

java - 如何制作带有超链接的复选框