Java AES加密在16个字符后发散

Java AES加密在16个字符后发散,java,android,encryption,aes,Java,Android,Encryption,Aes,在将数据发送到.NET服务器之前,我使用AES算法对iPhone和Android应用程序上的数据进行加密 iPhone加密工作正常(使用.NET服务器代码对其进行解密没有问题) Android加密对于小于16个字符的明文字符串非常有效。对于大于等于16个字符的明文字符串,第一个加密的“块”与iPhone相同,第二个加密的块则完全不同。我的钥匙长度是16个字符 以下是Android代码(最多16个字符): byte[]valueData=value.getBytes(); byte[]keyDat

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

iPhone加密工作正常(使用.NET服务器代码对其进行解密没有问题)

Android加密对于小于16个字符的明文字符串非常有效。对于大于等于16个字符的明文字符串,第一个加密的“块”与iPhone相同,第二个加密的块则完全不同。我的钥匙长度是16个字符

以下是Android代码(最多16个字符):

byte[]valueData=value.getBytes();
byte[]keyData=skey.getBytes();
SecretKeySpec skeySpec=新的SecretKeySpec(keyData,“AES”);
Cipher Cipher=Cipher.getInstance(“AES/ECB/PKCS7PADDING”);
cipher.init(cipher.ENCRYPT_模式,skeySpec);
字节[]valueEncryptedData=cipher.doFinal(valueData);
字符串valueEncryptedString=Base64.encodeToString(valueEncryptedData,Base64.DEFAULT);
返回值EncryptedString;
这是我的iOS代码,运行良好:

StringEncryption*crypto=[[StringEncryption alloc]init];
cOptions padding=kCCOptionPKCS7Padding;
NSData*valueData=[value dataUsingEncoding:NSUTF8StringEncoding];
NSData*keyData=[skey dataUsingEncoding:NSUTF8StringEncoding];
NSData*valueEncryptedData=[加密:valueData密钥:密钥数据填充:&填充];
NSString*valueEncryptedString=[valueEncryptedData Base64编码,线宽:0];

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

很可能您使用的加密模式不正确。而且,最有可能的是,你应该使用CBC而不是ECB。
而且,由于CBC需要IV(初始向量),所以从第一次尝试开始就不起作用,不同的加密方案可以使用不同的默认向量。

您是否在加密函数中使用对
CCCrypt
的简单调用?您应该展示如何在iOS中执行加密-最好是加密调用。请同时显示您的解密代码。您好@Patesh,我们使用的是David Veksler编写的iOS加密代码(请参阅zip文件中的StringEncryption.m)并已解决。我没有给你静脉注射,谢谢!