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“原语”在两个平台上是相同的,互联网上有工作代码.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值