[英]aes decryption \0 character ios
我有一个问题..当我解密从我的php页面返回的数据时,如果字符串的长度小于16,则将char \\ 0追加到字符串之后。 原始字符串是: 100000065912248我使用此函数解密加密的字符串:
#define FBENCRYPT_ALGORITHM kCCAlgorithmAES128
#define FBENCRYPT_BLOCK_SIZE kCCBlockSizeAES128
#define FBENCRYPT_KEY_SIZE kCCKeySizeAES256
+ (NSData*)decryptData:(NSData*)data key:(NSData*)key iv:(NSData*)iv;
{
NSData* result = nil;
// setup key
unsigned char cKey[FBENCRYPT_KEY_SIZE];
bzero(cKey, sizeof(cKey));
[key getBytes:cKey length:FBENCRYPT_KEY_SIZE];
// setup iv
char cIv[FBENCRYPT_BLOCK_SIZE];
bzero(cIv, FBENCRYPT_BLOCK_SIZE);
if (iv) {
[iv getBytes:cIv length:FBENCRYPT_BLOCK_SIZE];
}
// setup output buffer
size_t bufferSize = [data length] + FBENCRYPT_BLOCK_SIZE;
void *buffer = malloc(bufferSize);
int length = [data length];
// do decrypt
size_t decryptedSize = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
FBENCRYPT_ALGORITHM,
0,
cKey,
FBENCRYPT_KEY_SIZE,
cIv,
[data bytes],
[data length],
buffer,
bufferSize,
&decryptedSize);
if (cryptStatus == kCCSuccess) {
result = [NSData dataWithBytesNoCopy:buffer length:decryptedSize];
} else {
free(buffer);
NSLog(@"[ERROR] failed to decrypt| CCCryptoStatus: %d", cryptStatus);
}
return result;
}
我向函数发送一个nil“ iv”参数,然后在函数中使用“ cIv”,它包含以下内容:
结果是准确的,但是字符串的长度是16而不是15(字符串:100000065912248)。 实际上,最后一个字符是\\ 0。
为什么? 我该如何解决?
编辑:
PHP加密功能:
function encrypt($plaintext) {
$key = 'a16byteslongkey!a16byteslongkey!';
$base64encoded_ciphertext = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plaintext, MCRYPT_MODE_CBC));
$base64encoded_ciphertext = trim($base64encoded_ciphertext);
return $base64encoded_ciphertext;
}
AES是一个块密码,用于加密/解密长度为128位(16字节)的块。 因此,如果数据不是块大小,则必须添加一些填充。 苹果公司最受欢迎和支持的是PKCS7。
与PHP的接口必须考虑填充和可能的base64编码。
解决方案是在PHP和iOS双方上使用相同的填充。
AES始终在16个字节上运行,没有选项-因此,如果您有15个字节,则必须添加一个字节,即填充。 据我了解(对PHP加密了解不多),PHP并不是真正的PCKS7padding,最好是自己动手做。 在Wikipedia中查找PKCS7。
如果仅对字符串进行操作,则应该使用零填充(默认),但是如果出于互操作性原因,我建议使用PKCS#7填充。
使用零填充时,纯文本将填充00
值的字节,但仅在需要时才填充。 这与始终部署的PKCS#7填充不同。 解密后,可以对解密后的纯文本使用trim
功能。 然后,您应该获得原始字符串。
这显然不适用于二进制数据,因为它的结尾可能是trim
函数删除的字符。 请注意,PHP中的trim
似乎剥夺了00
个字节。 这不是给定的,尽管许多运行时都以这种方式对待,但正式地00
不是空格。
您必须从解密的数据中删除填充
function removePadding($decryptedText){
$strPad = ord($decryptedText[strlen($decryptedText)-1]);
$decryptedText= substr($decryptedText, 0, -$strPad);
return $decryptedText;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.