AES 加密不起作用 (Xcode)
AES Encryption is not working (Xcode)
我正在尝试使用以下代码使用 AES128 方法将 Xcode 中的字符串加密为 PHP:
Xcode
- (NSData*)AES256EncryptWithKey:(NSString*)key {
char keyPtr[kCCKeySizeAES256];
[key cStringUsingEncoding:NSASCIIStringEncoding];
NSString *iv = @"fdsfds85435nfdfs";
char ivPtr[kCCKeySizeAES128];
[iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSASCIIStringEncoding];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void* buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, NULL,
keyPtr, kCCKeySizeAES256,
ivPtr,
[self bytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess)
{
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer); //free the buffer;
return nil;
}
但是当我运行上面的编码时,下面的结果不是我期望的:
NSString *key = @"89432hjfsd891787";
NSData *plaintext = [[@"aaa0000000000000" dataUsingEncoding:NSASCIIStringEncoding] AES256EncryptWithKey: key];
NSString *mystring = [[NSString alloc] initWithData:plaintext encoding:NSASCIIStringEncoding];
NSLog(@"mystring %@", mystring);
输出是
uçó)â½S/èRÅ
我想要的是这样的。
m9FNGM9IiwibWFjIjoiNmJkYzNmZTA5
您似乎需要 Base64 编码的字符串。
NSString *mystring = [plaintext base64EncodedStringWithOptions:0];
注意:由于编码错误,keyPtr
未设置 为 key
值,它成为未初始化内存的值。
你得到 "uçó)â½S/èRÅ" 是因为你试图从数据中创建一个字符串,但有几个原因这不起作用。
- 许多数据字节未映射到可打印的 ASCII 字符或任何 unicode 字符。
- 一个数据字节可以是 0(平均 256 个字节中的 1 个将是 0x00),这是 "C" 字符串的终止符,因此字符串会很短。
将数据编码为字符串表示有两种通用约定:
- 十六进制 ascii,其中每个数据字节被编码为两个字符 0-9a-f。
- Base64,其中每 3 个数据数据字节被编码为 4 个 ASCII 字符。
您可能正在寻找 Base64 编码:
NSString *mystring = [plaintext base64EncodedStringWithOptions:0];
代码中的其他错误:
[key cStringUsingEncoding:NSASCIIStringEncoding];
字符串可能不是ASCII,最好使用NSUTF8StringEncoding
。请注意,未捕获输出。
keyPtr
从未设置为键值,见上文。
- 密钥大小 ID 指定为 256 位(32 字节)但密钥为 16 个字符,请使用与密钥匹配的密钥大小。
char ivPtr[kCCKeySizeAES128]
,iv 大小是块大小而不是密钥大小:kCCBlockSizeAES128
。
我正在尝试使用以下代码使用 AES128 方法将 Xcode 中的字符串加密为 PHP:
Xcode
- (NSData*)AES256EncryptWithKey:(NSString*)key {
char keyPtr[kCCKeySizeAES256];
[key cStringUsingEncoding:NSASCIIStringEncoding];
NSString *iv = @"fdsfds85435nfdfs";
char ivPtr[kCCKeySizeAES128];
[iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSASCIIStringEncoding];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void* buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, NULL,
keyPtr, kCCKeySizeAES256,
ivPtr,
[self bytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess)
{
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer); //free the buffer;
return nil;
}
但是当我运行上面的编码时,下面的结果不是我期望的:
NSString *key = @"89432hjfsd891787";
NSData *plaintext = [[@"aaa0000000000000" dataUsingEncoding:NSASCIIStringEncoding] AES256EncryptWithKey: key];
NSString *mystring = [[NSString alloc] initWithData:plaintext encoding:NSASCIIStringEncoding];
NSLog(@"mystring %@", mystring);
输出是
uçó)â½S/èRÅ
我想要的是这样的。
m9FNGM9IiwibWFjIjoiNmJkYzNmZTA5
您似乎需要 Base64 编码的字符串。
NSString *mystring = [plaintext base64EncodedStringWithOptions:0];
注意:由于编码错误,keyPtr
未设置 为 key
值,它成为未初始化内存的值。
你得到 "uçó)â½S/èRÅ" 是因为你试图从数据中创建一个字符串,但有几个原因这不起作用。
- 许多数据字节未映射到可打印的 ASCII 字符或任何 unicode 字符。
- 一个数据字节可以是 0(平均 256 个字节中的 1 个将是 0x00),这是 "C" 字符串的终止符,因此字符串会很短。
将数据编码为字符串表示有两种通用约定:
- 十六进制 ascii,其中每个数据字节被编码为两个字符 0-9a-f。
- Base64,其中每 3 个数据数据字节被编码为 4 个 ASCII 字符。
您可能正在寻找 Base64 编码:
NSString *mystring = [plaintext base64EncodedStringWithOptions:0];
代码中的其他错误:
[key cStringUsingEncoding:NSASCIIStringEncoding];
字符串可能不是ASCII,最好使用NSUTF8StringEncoding
。请注意,未捕获输出。keyPtr
从未设置为键值,见上文。- 密钥大小 ID 指定为 256 位(32 字节)但密钥为 16 个字符,请使用与密钥匹配的密钥大小。
char ivPtr[kCCKeySizeAES128]
,iv 大小是块大小而不是密钥大小:kCCBlockSizeAES128
。