我想加密Xcode中的字符串並用PHP解密或用PHP加密並用Xcode解密。Xcode AES加密/解密 - php兼容性問題
所以首先我試圖得到相同的AES encryption
結果。
這裏是我的Xcode的文件(我已經把一切爲了簡單起見,單個文件):
#import "t.h"
#import <CommonCrypto/CommonCryptor.h>
@interface NSData(AES)
- (NSData*)AES256EncryptWithKey:(NSString*)key;
- (NSData*)AES256DecryptWithKey:(NSString*)key;
@end
@implementation NSData (AES)
- (NSData*)AES256EncryptWithKey:(NSString*)key {
char keyPtr[kCCKeySizeAES256];
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSASCIIStringEncoding];
NSString *iv = @"1234567812345678";
char ivPtr[kCCKeySizeAES128];
[iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSASCIIStringEncoding];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void* buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, NULL,
keyPtr, kCCKeySizeAES256,
ivPtr /* initialization vector (optional) */,
[self bytes], dataLength, /* input */
buffer, bufferSize, /* output */
&numBytesEncrypted);
if (cryptStatus == kCCSuccess)
{
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer); //free the buffer;
return nil;
}
- (NSData*)AES256DecryptWithKey:(NSString*)key {
char keyPtr[kCCKeySizeAES256];
NSString *iv = @"1234567812345678";
char ivPtr[kCCKeySizeAES128];
[iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSASCIIStringEncoding];
// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSASCIIStringEncoding];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void* buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, NULL,
keyPtr, kCCKeySizeAES256,
ivPtr /* initialization vector (optional) */,
[self bytes], dataLength, /* input */
buffer, bufferSize, /* output */
&numBytesDecrypted);
if (cryptStatus == kCCSuccess)
{
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer); //free the buffer;
return nil;
}
@end
@interface t()
@end
@implementation t
- (void)viewDidLoad
{
[super viewDidLoad];
NSString *key = @"12345678123456781234567812345678";
NSData *plaintext = [[@"aaa0000000000000" dataUsingEncoding:NSASCIIStringEncoding] AES256EncryptWithKey: key];
label1.text = [[NSString alloc] initWithData:plaintext encoding:NSASCIIStringEncoding];
}
@end
而現在的PHP代碼:
<?php
$key256 = "12345678123456781234567812345678";
$iv128 = "1234567812345678";
$text = "aaa";
$blocksize = 16;
$len = strlen($text);
$pad = $blocksize - ($len % $blocksize);
$text .= str_repeat("0", $pad);
$cipher = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key256, $text, MCRYPT_MODE_CBC, $iv128);
echo $cipher;
?>
Xcode的加密字符串和PHP加密的字符串不同。
PHP:â5¢Ð[Iüf#hÂ(Æ
的Xcode:¡#yZPbEs¿D6ñ
我能做些什麼,使工作?難道我做錯了什麼?
我將進一步解釋代碼做什麼,它是如何構成的,所以你可以更容易理解的問題(糾正我,如果我錯了):
PHP和Xcode中使用CBC AES加密等等我想那裏沒有問題。你可以看到我只是試圖得到相同的結果 - 安全無關緊要 - 所以我沒有填充 - 文本長度正好是128位(16個字符)。
密鑰是256位(32個字符)。
初始化向量是128位(16個字符)。
非常感謝。
任何幫助表示讚賞!
行' - (NSData *)AES256EncryptWithKey:(NSString *)key {'確實正確地定義了與PHP相同的密鑰,是嗎? – LSerni
是的。你可以在我的代碼中看到兩個鍵。 – BechD