Objective-c AES加密不';看起来不像javaaes加密

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

我正试图用这种方法加密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'};

    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方面也需要知道这一点)