Objective-c AES加密不';看起来不像javaaes加密
我正试图用这种方法加密objective c中的一个字符串:Objective-c AES加密不';看起来不像javaaes加密,java,iphone,objective-c,encryption,aes,Java,Iphone,Objective C,Encryption,Aes,我正试图用这种方法加密objective c中的一个字符串: @implementation NSData (AES128) (NSData *)AES128Encrypt { char keyPtr[kCCKeySizeAES128] = {'\xe1','\xaa','\x9c','\x61','\x46','\x74','\x44','\x56','\xf0','\xe5','\x47','\x46','\x86','\xdc','\x95','\x77'}; NSUIntege
@implementation NSData (AES128)
- (NSData *)AES128Encrypt {
char keyPtr[kCCKeySizeAES128] = {'\xe1','\xaa','\x9c','\x61','\x46','\x74','\x44','\x56','\xf0','\xe5','\x47','\x46','\x86','\xdc','\x95','\x77'};
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,keyPtr,kCCKeySizeAES128,NULL /* initialization vector (optional) /,[self bytes], dataLength, / input /buffer, bufferSize, / output */
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
//the returned NSData takes ownership of the buffer and will free it on deallocation
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer); //free the buffer;
return nil;
}
- (NSData *)AES128Decrypt {
char keyPtr[kCCKeySizeAES128] = {'\xe1','\xaa','\x9c','\x61','\x46','\x74','\x44','\x56','\xf0','\xe5','\x47','\x46','\x86','\xdc','\x95','\x77'};
NSUInteger dataLength = [self length];
//See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//That's why we need to add the size of one block here
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus=CCCrypt(kCCDecrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,keyPtr, kCCKeySizeAES128,NULL /* initialization vector (optional) /,[self bytes], dataLength, / input /buffer, bufferSize, / output */&numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
//the returned NSData takes ownership of the buffer and will free it on deallocation
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer); //free the buffer;
return nil;
}
@end
@实现NSData(AES128)
- (NSData*)加密{
char keyPtr[kCCKeySizeAES128]={'\xe1','\xaa','\x9c','\x61','\x46','\x74','\x44','\x56','\xf0','\xe5','\x47','\x46','\x86','\xdc','\x95','\x77'}
NSU整数数据长度=[自身长度]
size\u t bufferSize=dataLength+kccblocksizeaaes128;
void*buffer=malloc(bufferSize)
大小\u t numBytesEncrypted=0;
CCCryptorStatus cryptStatus=CCCrypt(kCCEncrypt,kCCAlgorithmAES128,KCcopionPKCS7Padding,keyPtr,kCCKeySizeAES128,NULL/*初始化向量(可选)/,[self bytes],数据长度,/input/buffer,bufferSize,/output*/
&(未加密);
if(cryptStatus==kCCSuccess){
//返回的NSData拥有缓冲区的所有权,并在释放时释放缓冲区
返回[NSData DATAFTHBYTESNOCOPY:缓冲区长度:numBytesEncrypted];
}
释放(缓冲区);//释放缓冲区;
返回零;
}
- (NSData*)AES128解密{
char keyPtr[kCCKeySizeAES128]={'\xe1','\xaa','\x9c','\x61','\x46','\x74','\x44','\x56','\xf0','\xe5','\x47','\x46','\x86','\xdc','\x95','\x77'}
NSU整数数据长度=[自身长度]
//参见文档:对于分组密码,输出大小将始终小于或
//等于输入大小加上一个块的大小。
//这就是为什么我们需要在这里添加一个块的大小
size\u t bufferSize=dataLength+kccblocksizeaaes128;
void*buffer=malloc(bufferSize)
大小\u t numBytesDecrypted=0;
CCCryptorStatus cryptStatus=CCCrypt(kCCDecrypt、kCCAlgorithmAES128、KCCOPionPKCS7Padding、keyPtr、kCCKeySizeAES128、NULL/*初始化向量(可选)/、[自字节]、数据长度、/input/buffer、bufferSize、/output*/&numBytesDecrypted)
if(cryptStatus==kCCSuccess){
//返回的NSData拥有缓冲区的所有权,并在释放时释放缓冲区
返回[NSData DATAFTHBYTESNOPY:缓冲区长度:numbytes加密];
}
释放(缓冲区);//释放缓冲区;
返回零;
}
@结束
那么我把它叫做这里:
NSString *strData = @"My string";
NSData *objNSData = [NSData dataWithData:[strData dataUsingEncoding: NSUTF8StringEncoding]];
NSLog(@"encrypted: %@",[objNSData description]);
NSString*strData=@“我的字符串”
NSData*objNSData=[NSData dataWithData:[strData dataUsingEncoding:NSUTF8StringEncoding]]
NSLog(@“加密:%@,[objNSData description]);
如果我只是在目标c中使用它,它工作得很好。
但是,当我试图将它发送到java服务器时,它不起作用
我的密码数据如下所示:
86fcf0fa9e3dff93dc8918ffd02ee203 12DE0BF8C8BA30045629C4240296C0D
如果我尝试用java用同样密钥的AES对其进行加密,我会得到以下结果:
86fcf0fa9e3dff93dc8918ffd02ee203 8388F173DA143C6EEB90E554259C83C
这很奇怪,因为前半部分是一样的
有人知道为什么会这样?
谢谢。我从未做过任何Objective-C编程,但我几乎可以肯定的是,您在不同的代码中使用了AES。你需要确保这些是一致的。默认值可能是模式。确保在Java代码中设置了此选项
顺便说一下,CBC模式应该有一个随机初始化向量(IV),而不是NULL(我假设它使用全零)。这也需要在两者之间保持一致
我必须给出加密技术的标准免责声明,使用更高级别的协议来处理这些东西通常会更安全,比如SSL/TLS用于传输中的数据,以及其他类似于静止数据的协议。正确的加密非常困难,一个微小的错误(比如选择一个坏模式)会完全破坏系统的安全。man I love you:)事实上,问题是我只是将kCCOptionPKCS7Padding选项传递给了CCCrypt函数,在这里我必须传递kCCOptionPKCS7Padding | kCCOptionECBMode选项,谢谢,你的回答救了我一命:)不客气。请记住,正如我前面提到的,您确实不应该使用ECB模式。如果可能的话,使用CBC之类的工具。请参见(直接链接:)的第3幕第21幕。问题在于,ECB模式似乎是obj CAC中支持的唯一方式。根据,默认模式(如果未指定模式)为CBC。我会用这个。“kCCOptionPKCS7Padding”也可以使用。只需确保在Java方面也这样做。此外,您应该使用随机初始化向量(Java方面也需要知道这一点)