iOS中的3DES加密似乎不加密最后一个块 [英] 3DES encryption in iOS does not seem to encrypt last block
问题描述
NSString * v_plainText = @1234567890123456789012345678;
NSString * plainText =(const void *)[v_plainText UTF8String];
size_t plainTextBufferSize = [v_plainText length];
size_t bufferPtrSize =(plainTextBufferSize + kCCBlockSize3DES)& 〜(kCCBlockSize3DES - 1);
size_t movedBytes = 0;
uint8_t * bufferPtr = malloc(bufferPtrSize * sizeof(uint8_t));
Byte iv [8] = {0,0,0,0,0,0,0,0};
NSString * key =(const void *)[@12345678ABCDEFGH!@#$%^& *UTF8String];
CCCryptorStatus ccStatus;
ccStatus = CCCrypt(kCCEncrypt,
kCCAlgorithm3DES,
kCCOptionPKCS7Padding& kCCModeCBC,
key,
kCCKeySize3DES,
iv,
plainText,
plainTextBufferSize,
(void *)bufferPtr,//输出
bufferPtrSize,
& movedBytes);
NSData * result = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
NSString * str = [result base64EncodedStringWithOptions:0];
这给出了这个结果:
geHFnvoept2aKiruo6InSvc7WVPdHNq2
当我在.NET中运行模拟代码时,给我这个结果:
geHFnvoept2aKiruo6InSvc7WVPdHNq2TENQX5q9Beg =
由于某种原因,返回24字节,而输入为28字节。我期望它是32个字节,如.NET版本。我无法确定我在这里做错什么。
加密错误是:
kCCOptionPKCS7Padding& kCCModeCBC,
您需要 |
code>& 但 kCCModeCBC
不是一个有效的选项,因为CBC是默认模式,不需要任何选项,您只需要:
kCCOptionPKCS7Padding,
不幸的是还有其他的ObjectiveC编码错误,主要是:
NSString * plainText =(const void *)[v_plainText UTF8字符串];
NSString * key =(const void *)[@12345678ABCDEFGH!@#$%^& *UTF8String];
而是使用:
NSData * plainText = [v_plainText dataUsingEncoding:NSUTF8StringEncoding];
NSData * key = [@12345678ABCDEFGH!@#$%^& *dataUsingEncoding:NSUTF8StringEncoding];
以下是转换为使用NSData的完整代码:
NSString * plainText = @1234567890123456789012345678;
NSString * keyText = @12345678ABCDEFGH!@#$%^& *;
NSData * plainData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
NSData * keyData = [keyText dataUsingEncoding:NSUTF8StringEncoding];
Byte iv [8] = {0,0,0,0,0,0,0,0};
size_t bufferSize = plainData.length + kCCBlockSize3DES;
NSMutableData * cypherData = [NSMutableData dataWithLength:bufferSize];
size_t movedBytes = 0;
CCCryptorStatus ccStatus;
ccStatus = CCCrypt(kCCEncrypt,
kCCAlgorithm3DES,
kCCOptionPKCS7Padding,
keyData.bytes,
kCCKeySize3DES,
iv,
plainData.bytes,
plainData.length,
cypherData.mutableBytes,
cypherData.length,
& movedBytes);
cypherData.length = movedBytes;
NSString * str = [cypherData base64EncodedStringWithOptions:0];
NSLog(@str:%@,str);
Oputput:
str:geHFnvoept2aKiruo6InSvc7WVPdHNq2TENQX5q9Beg =
I have the following code in objective-c
NSString* v_plainText = @"1234567890123456789012345678";
NSString* plainText = (const void *) [v_plainText UTF8String];
size_t plainTextBufferSize = [v_plainText length];
size_t bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
size_t movedBytes = 0;
uint8_t *bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
Byte iv[8] = {0,0,0,0,0,0,0,0};
NSString *key = (const void *) [@"12345678ABCDEFGH!@#$%^&*" UTF8String];
CCCryptorStatus ccStatus;
ccStatus = CCCrypt(kCCEncrypt,
kCCAlgorithm3DES,
kCCOptionPKCS7Padding & kCCModeCBC,
key,
kCCKeySize3DES,
iv,
plainText,
plainTextBufferSize,
(void *)bufferPtr, // output
bufferPtrSize,
&movedBytes);
NSData* result = [NSData dataWithBytes:(const void*)bufferPtr length:(NSUInteger)movedBytes];
NSString* str = [result base64EncodedStringWithOptions:0];
This gives this result:
geHFnvoept2aKiruo6InSvc7WVPdHNq2
When I run simular code in .NET it gives me this result:
geHFnvoept2aKiruo6InSvc7WVPdHNq2TENQX5q9Beg=
For some reason the objective-c version only returns 24 bytes while the input is 28 bytes. I would expect it to be 32 bytes like in the .NET version. I was unable to determine what I'm doing wrong here.
The encryption error is:
kCCOptionPKCS7Padding & kCCModeCBC,
You need |
, not &
but kCCModeCBC
is not a valid option and no option is needed because CBC is the default mode, you simply need:
kCCOptionPKCS7Padding,
Unfortunatly there are other objectiveC coding errors, mainly:
NSString* plainText = (const void *) [v_plainText UTF8String];
NSString *key = (const void *) [@"12345678ABCDEFGH!@#$%^&*" UTF8String];
Instead use:
NSData* plainText = [v_plainText dataUsingEncoding:NSUTF8StringEncoding];
NSData *key = [@"12345678ABCDEFGH!@#$%^&*" dataUsingEncoding:NSUTF8StringEncoding];
Here is the complete code converted to use NSData:
NSString* plainText = @"1234567890123456789012345678";
NSString* keyText = @"12345678ABCDEFGH!@#$%^&*";
NSData* plainData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
NSData *keyData = [keyText dataUsingEncoding:NSUTF8StringEncoding];
Byte iv[8] = {0,0,0,0,0,0,0,0};
size_t bufferSize = plainData.length + kCCBlockSize3DES;
NSMutableData *cypherData = [NSMutableData dataWithLength:bufferSize];
size_t movedBytes = 0;
CCCryptorStatus ccStatus;
ccStatus = CCCrypt(kCCEncrypt,
kCCAlgorithm3DES,
kCCOptionPKCS7Padding,
keyData.bytes,
kCCKeySize3DES,
iv,
plainData.bytes,
plainData.length,
cypherData.mutableBytes,
cypherData.length,
&movedBytes);
cypherData.length = movedBytes;
NSString* str = [cypherData base64EncodedStringWithOptions:0];
NSLog(@"str: %@", str);
Oputput:
str: geHFnvoept2aKiruo6InSvc7WVPdHNq2TENQX5q9Beg=
这篇关于iOS中的3DES加密似乎不加密最后一个块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!