Tho*_*sen 2 iphone base64 encode des
我正在尝试在iPhone上的Objective C中加密NSString.当我编码"us = foo; pw = bar; pwAlg = false;"时,至少我不想得到像"TmsbDaNG64lI8wC6NLhXOGvfu2IjLGuEwc0CzoSHnrs ="这样的字符串.使用此键:"testtest".
我现在的问题是,CCCrypt总是返回"4300 - 参数错误",我不知道为什么.
这是我的代码(5小时google和try'n'error的结果):
NSString *token = @"us=foo;pw=bar;pwAlg=false;";
NSString *key = @"testtest";
const void *vplainText;
size_t plainTextBufferSize;
plainTextBufferSize = [token length];
vplainText = (const void *) [token UTF8String];
CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = 0;
size_t *movedBytes;
bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, bufferPtrSize);
// memset((void *) iv, 0x0, (size_t) sizeof(iv));
NSString *initVec = @"init Vec";
const void *vkey = (const void *) [key UTF8String];
const void *vinitVec = (const void *) [initVec UTF8String];
ccStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmDES,
kCCOptionECBMode,
vkey, //"123456789012345678901234", //key
kCCKeySizeDES,
NULL,// vinitVec, //"init Vec", //iv,
vplainText, //"Your Name", //plainText,
plainTextBufferSize,
(void *)bufferPtr,
bufferPtrSize,
movedBytes);
NSString *result;
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
result = [myData base64Encoding];
Run Code Online (Sandbox Code Playgroud)
cra*_*erm 10
ECB模式下的DES加密使用8字节块大小,并分别对每个块进行编码.问题是您的输入字符串不会平均分为8个字节,并且加密器不知道如何处理最后的非8字节块.
修复是通过将kCCOptionPKCS7Padding添加到CCCrypt的选项来允许加密器填充最终块.例如(来自NSData加密类别的片段):
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr,
kCCKeySizeDES,
NULL,
[self bytes],
dataLength,
buffer,
bufferSize
&numBytesEncrypted);
Run Code Online (Sandbox Code Playgroud)
有关填充算法的更多详细信息,请查看此文章.希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
14132 次 |
| 最近记录: |