对方JAVA服务端,AES加密问题。

swalia2 2017-08-16 03:11:44
public static String aesEncrypt(String content, String encryptKey) throws Exception {
return base64Encode(aesEncryptToBytes(content, encryptKey));
}

public static String base64Encode(byte[] bytes) {
return new BASE64Encoder().encode(bytes);
}

public static byte[] aesEncryptToBytes(String content, String encryptKey) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed(encryptKey.getBytes());
kgen.init(128, random);

Cipher cipher = Cipher.getInstance("AES");
cipher.init(1, new SecretKeySpec(kgen.generateKey().getEncoded(), "AES"));

return cipher.doFinal(content.getBytes("utf-8"));
}

String xml = SecurityUtil.aesEncrypt(requestxml, "FOSUN2016");
密钥为:FOSUN2016,把字符:123456加密后是:pUY2OW61xu9SGLBNPRzZtw==
我用C#来操作,怎么写加密后的密文都不一样,请教几个老师,有没有好方法?对方无法提供 DLL调用,必须要我们自己写。
...全文
323 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
卧槽,楼主你是不是对接复星的,我也遇到了,一模一样的情况,求解决方法!!
swalia2 2017-08-17
  • 打赏
  • 举报
回复
求个代码,实在搞不定了
眼镜凶 2017-08-17
  • 打赏
  • 举报
回复
java里一个byte取值范围是-128~127, 而C#里一个byte是0~255,你二要使用边相同的byte,你这个密钥二边解出来不一样的,所以。。
泡泡龙 2017-08-17
  • 打赏
  • 举报
回复
你那个加密的结果是base64
swalia2 2017-08-16
  • 打赏
  • 举报
回复
引用 6 楼 saixin2009 的回复:
1.C# AES加密解密 与JAVA AES CBC/NoPadding是一致的 经过测试 2.确定java aes加密的方式是什么 3.指定Key和IV(指定的字符串) 保证两段的一致性 4.使用UTF8Encoding utf8WithoutBom = new System.Text.UTF8Encoding(false) 无包头的utf-8编码进行byte[] key = utf8WithoutBom.GetBytes(KeyStr); byte[] iv = utf8WithoutBom.GetBytes(IVStr); 5.aes算法进行加解密
试了,但是加密结果也不是对方发的:pUY2OW61xu9SGLBNPRzZtw==,您有C#的代码吗?帮忙贴一下,谢谢!
saixin2009 2017-08-16
  • 打赏
  • 举报
回复
1.C# AES加密解密 与JAVA AES CBC/NoPadding是一致的 经过测试 2.确定java aes加密的方式是什么 3.指定Key和IV(指定的字符串) 保证两段的一致性 4.使用UTF8Encoding utf8WithoutBom = new System.Text.UTF8Encoding(false) 无包头的utf-8编码进行byte[] key = utf8WithoutBom.GetBytes(KeyStr); byte[] iv = utf8WithoutBom.GetBytes(IVStr); 5.aes算法进行加解密
zeng_z 2017-08-16
  • 打赏
  • 举报
回复
是不是因为秘钥位数不一样呢,我记得C++有个库用AES加密,就要设置加密的秘钥位数
swalia2 2017-08-16
  • 打赏
  • 举报
回复
HA1PRNG必定是传入是不变的,上面的代码就是对方给的测试的java文件,在线等希望能有结果
倒退一天 2017-08-16
  • 打赏
  • 举报
回复
我不懂java,但是从代码上看,首先是把秘钥用哈希算法散列加密了一次作为随机种子生成了一个随机(128字节或者是128位,不懂所以猜的)秘钥,然后再根据这个秘钥进行AES加密。所以你无论如何都不可能加密跟他加密出来一样。不知道我理解的对不对哈
  • 打赏
  • 举报
回复
看起来java是将秘钥用SHA1算法得到的摘要结果作为秘钥进行加密的(我也不知道SHA1PRNG是不是就是SHA1算法,但SecureRandom是java里面用于生成随机数的类,但AES本身是可逆算法,所以SHA1PRNG必定是传入的值不变,得到的值结果也就是固定的,否则无法可逆) 另外encryptKey.getBytes()这边没有指定编码……
  • 打赏
  • 举报
回复
我看到你有将字符转成byte的操作,java里面使用2个字节表示一个字符,而C、C#是使用1个字节表示字符。你检查下是不是因为这样导致输入不一样,以至于输出不同。 你可以看看在java中"FOSUN2016”转成byte[]是多少,然后再看看C#里面转成byte[]是多少,对比一下。

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧