3

在将数据发送到 .NET 服务器之前,我使用 AES 算法对 iPhone 和 Android 应用程序上的数据进行加密。

iPhone 加密工作正常(.NET 服务器代码解密它没问题)。

Android 加密适用于小于 16 个字符的明文字符串。对于 >= 16 字符的明文字符串,第一个加密的“块”与 iPhone 相同,第二个加密的块完全不同。我的密钥长度是 16 个字符。

这是 Android 代码(最多可以使用 16 个字符):

byte[] valueData = value.getBytes();   
byte[] keyData = skey.getBytes();

SecretKeySpec skeySpec = new SecretKeySpec(keyData, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

byte[] valueEncryptedData = cipher.doFinal(valueData);
String valueEncryptedString = Base64.encodeToString(valueEncryptedData, Base64.DEFAULT);

return valueEncryptedString;

这是我的 iOS 代码,运行良好:

StringEncryption *crypto = [[StringEncryption alloc] init];
CCOptions padding = kCCOptionPKCS7Padding;

NSData *valueData = [value dataUsingEncoding:NSUTF8StringEncoding];
NSData *keyData = [skey dataUsingEncoding:NSUTF8StringEncoding];
NSData *valueEncryptedData = [crypto encrypt:valueData key:keyData padding:&padding];
NSString *valueEncryptedString = [valueEncryptedData base64EncodingWithLineLength:0];

我怀疑这个问题是微不足道的。例如,也许我使用了错误的密码初始化,我应该使用 CBC 而不是 ECB。但是,使用的输出Cipher.getInstance("AES/CBC/PKCS7PADDING")也不会产生预期的结果,(事实上,更糟糕的是,加密值与 iPhone 加密值完全不同,而不仅仅是在前 16 个字符之后发散)。

4

1 回答 1

2

您很可能使用了不正确的密码模式。而且,最有可能的是,您应该使用 CBC 而不是 ECB。而且,它从第一次尝试就行不通,因为 CBC 需要 IV(初始向量),并且不同的加密方案可以使用不同的默认向量。

于 2013-02-27T09:35:47.907 回答