iOS中的3DES加密似乎不加密最后一个块 [英] 3DES encryption in iOS does not seem to encrypt last block

查看:125
本文介绍了iOS中的3DES加密似乎不加密最后一个块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆