[英]IOS DES encryption & PHP decryption not working reliably
我正在使用以下方法在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%的时间正常运行,但我不确定为什么它有时会失败。 有什么线索吗? 谢谢您的帮助!
这可能是填充,这是两种方法之间唯一不同步的事情。 不幸的是,您可能必须创建自己的非填充形式mcrypt,因为该库不执行PKCS#5填充(实际上与PKCS#7填充相同)。 幸运的是,这很简单:解密,然后使用最后一个字节的值剥离最后一个字节。
其他与安全性相关的注意事项:
事实证明,我所做的加密/解密没有错。 问题在于,PHP中的urldecode()并未将'%2B'解码为'+'(而是解码为'')。 我从PHP中的urldecode()切换到rawurldecode(),现在一切正常!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.