AES 解密服务器加密过的文本,总是解不出来,求出路

2016-01-18 15:23:17 +08:00
 scfhao

参考的安卓端解密的代码写的,但安卓端解密没问题,我写的一直解不出来。
安卓解密代码如下:
java
byte[] keyBy = key.getBytes("utf-8");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
SecretKeySpec keyspec = new SecretKeySpec(keyBy, "AES");
cipher.init(Cipher.DECRYPT_MODE, keyspec);
return cipher.doFinal(toDecrypt);

我写的 Objective-C 代码:
```ObjC
char keyPtr[kCCKeySizeAES128+1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

NSUInteger dataLength = [data length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);

size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode, keyPtr, kCCKeySizeAES128, NULL, [data bytes], dataLength, buffer, bufferSize, &numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted freeWhenDone:YES];
}
free(buffer);
return nil;
```
PKCS7Padding 、 ECB 、密钥都一致,但解出来的东西不一样,我把 128 、 192 、 256 这三种密钥长度也都试了一遍也不行,求大神指点一下还可能是什么地方的问题?

4771 次点击
所在节点    iDev
11 条回复
kenneth
2016-01-18 17:02:40 +08:00
可以换个语言来解解,看看算法是否正确。
suchj
2016-01-18 17:25:53 +08:00
这种问题可以这样解决:

在参考语言的版本里打印每一步的中间结果,然后在你所的的语言里也把第一步的中间结果打印出来,对比就知道最早出错的是在哪一步,逐步向下,就能写出新语言的版本。
yzimhao
2016-01-18 17:39:22 +08:00
可以试试 这个在线加解密工具
http://www.kjson.com/encrypt/enc/
Codist
2016-01-18 17:46:38 +08:00
之前遇到过一次, php 较低版本对于长度不足的密钥和初始向量会在其后补齐 '\0' 使其达到有效长度, java 应该是截取有效长度,密钥碰巧又多了一个字符,调了半天才发现
janxin
2016-01-18 19:11:47 +08:00
找一个第三方工具,快速加密解密结果确认问题出在哪一边
anerevol
2016-01-18 19:23:29 +08:00
scfhao
2016-01-21 15:39:32 +08:00
更新:
1 )找到个不错的在线加解密工具: http://www.seacha.com/tools/aes.html
2 )问题中的 iOS 代码和安卓代码都可以正确解密到原文本,但 iOS 的代码无法从加密过的二进制文件中解密文本(安卓代码却可以),这有可能是哪里的问题?
xuzhongzhou
2016-01-21 16:48:57 +08:00
@scfhao 楼主看看二进制文件是加密后的,还是 base64 编码过的。
iOS 的代码粗看看不出什么问题。自己试过后端加密后的数据解不出来,有的人习惯加密后的数据以 base64 encode 的字符串返回,有的是直接以十六进制的字符串返回。
scfhao
2016-01-21 20:59:27 +08:00
@xuzhongzhou 直接从服务器下载的数据文件(不是字符串形式),安卓端也没有 base64 编码转换的过程,我也试过用 base64 转换。
scfhao
2016-01-22 22:42:51 +08:00
Update :找了这么多天原因,绕回原点,才发现“竟然”是因为密钥不对应。之前和一个同事对了一下密钥:一致,便以为那个密钥是正确的,然后一直朝别的方向找原因,以至于浪费了很多时间。第一次在 v 站发帖,找到原因后突然觉得这个问题问的一点都没意义,因为前提就错了,然后发现 V2EX 不能删帖。
@kenneth
@suchj
@yzimhao
@Codist
@janxin
@anerevol
@xuzhongzhou
感谢各位的回复!
iOran
2016-01-22 23:32:20 +08:00
V 站设置不能删帖,还是有他的道理的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/251602

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX