Xcode で文字列を暗号化して PHP で復号化するか、PHP で暗号化して Xcode で復号化しようとしています。
そのため、まず同じAES encryption
結果を得ようとしています。
これが私のXcodeファイルです(簡単にするために、すべてを1つのファイルにまとめました):
#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 も AES 暗号化に CBC を使用しているため、問題はないと思います。
ご覧のとおり、同じ結果を得ようとしているだけです。ここではセキュリティは重要ではありません。したがって、パディングは使用しませんでした。テキストの長さは正確に 128 ビット (16 文字) です。
キーは 256 ビット (32 文字) です。
初期化ベクトルは 128 ビット (16 文字) です。
どうもありがとうございました。
どんな助けでも大歓迎です!