我正在使用以下方法在iOS中加密字符串
-(NSString *) encrypt:(NSString *) data
{
const void *vplainText;
size_t plainTextBufferSize = [data length];
vplainText = (const void *) [data UTF8String];
CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = 0;
size_t movedBytes = 0;
bufferPtrSize = (plainTextBufferSize + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, bufferPtrSize);
Byte iv [] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef};
NSString *key = @"complexkey";
const void *vkey = (const void *) [key UTF8String];
ccStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding | kCCOptionECBMode,
vkey,
kCCKeySizeDES,
iv,
vplainText,
plainTextBufferSize,
(void *)bufferPtr,
bufferPtrSize,
&movedBytes);
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
NSString *result = [myData base64Encoding];
// url encode the result
return (__bridge NSString *) CFURLCreateStringByAddingPercentEscapes(NULL,
(__bridge CFStringRef) result,
NULL,
(__bridge CFStringRef) @"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8);
}
在php上,我正在解密字符串,如下所示 -
$decrypted = mcrypt_decrypt(MCRYPT_DES, 'complexkey', base64_decode(urldecode($encrypted)), MCRYPT_MODE_ECB);
这似乎在75%的时间内正常工作,我不知道为什么它在其他时候会失败。有线索吗?谢谢你的帮助!
答案 0 :(得分:0)
它可能是填充,它是两种方法之间唯一不同步的东西。不幸的是,您可能必须创建自己的unpadding表单mcrypt,因为该库不执行PKCS#5填充(实际上与PKCS#7填充相同)。幸运的是,这很简单:解密,然后使用最后一个字节的值去除最后一个字节。
其他与安全相关的说明:
答案 1 :(得分:0)
事实证明,我正在进行的加密/解密没有任何问题。相反,问题是PHP中的urldecode()没有解码'%2B'到' +' (但改为')。我在PHP中从urldecode()切换到rawurldecode(),现在一切正常!