내 응용 프로그램에 암호화 및 암호 해독 클래스 메서드가 있습니다. 나는 '키'를 사용하여 '데이터'를 암호화 할 수 있으며 훌륭하게 작동합니다. 그 데이터를 디스크에 기록한 다음 나중에 응용 프로그램을 사용하여 데이터를 읽을 수 있으며 decryptWithKey를 호출하여 데이터 블록을 해독 할 수 있습니다. 모든 것이 훌륭하게 작동합니다. 그러나이 .m 클래스 파일을 다른 응용 프로그램에 포함하고 해당 응용 프로그램을 컴파일하고 첫 번째 응용 프로그램으로 암호화 된 동일한 데이터를 해독하려고하면 CCCrypt (암호 해독) 호출이 실패합니다 ... 정확히 말하면 성공을 반환합니다. 그러나 데이터는 해독되지 않습니다. 두 응용 프로그램에서 데이터와 키 값을 비교했으며 바이트까지 동일합니다.다른 응용 프로그램에서 암호 해독 할 때 CCCrypt가 실패합니다.
아이디어가 있으십니까? decryptWithKey
에서
+(BOOL)encryptWithKey:(NSMutableData*)data withKey:(NSString *)key
{
CCCryptorStatus result = kCCSuccess;
@try
{
char keyPtr1[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero(keyPtr1, sizeof(keyPtr1)); // fill with zeroes (for padding)
[key getCString: keyPtr1 maxLength: sizeof(keyPtr1) encoding: NSUTF8StringEncoding];
size_t numBytesEncrypted = 0;
size_t dataInLength = [data length];
size_t dataOutLength = 18*dataInLength;
[data setLength:dataOutLength];
result = CCCrypt(kCCEncrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,
(const void*)keyPtr1, kCCKeySizeAES256, 0 /* initialization vector (optional) */,
[data mutableBytes], dataInLength, /* input */
[data mutableBytes], dataOutLength, /* output */
&numBytesEncrypted);
[data setLength:numBytesEncrypted];
}
@catch (NSException *exception)
{
WDCATCH(exception);
}
return (result == kCCSuccess);
}
+(BOOL)decryptWithKey:(NSMutableData*)data plaintext:(NSString**)plaintext withKey:(NSString *)key
{
CCCryptorStatus result = kCCSuccess;
@try
{
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
char szPlaintext[1024]={0};
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
[key getCString: keyPtr maxLength: sizeof(keyPtr) encoding: NSUTF8StringEncoding];
size_t numBytesEncrypted = 0;
result = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
(const void*)keyPtr, kCCKeySizeAES256,
0 /* initialization vector (optional) */,
[data mutableBytes], [data length], /* input */
szPlaintext,1024,// [data mutableBytes], dataOutLength, /* output */
&numBytesEncrypted);
if (result == kCCSuccess)
{
szPlaintext[numBytesEncrypted] = 0;
*plaintext = [[NSString alloc] initWithFormat:@"%s",szPlaintext];
}
}
@catch (NSException *exception)
{
WDCATCH(exception);
} return (result == kCCSuccess);
}
위의 코드는 매우 안전하지 않습니다 (자세한 내용은 http://robnapier.net/blog/aes-commoncrypto-564 참조). '18 * dataInLength' 또한 매우 이상합니다. 최대로, 이것은'dataInLength + 16' 일 필요가 있지만, 여전히 작동해야합니다 (너무 큽니다). 원시 데이터를 암호화하지만 ASCII (심지어 UTF-8은 아님) 문자열의 암호를 해독하는 것이 좋습니다. 해독에 실패했다면 numBytesEncrypted가 0보다 큰가요? 아마도 % s의 ASCII 변환이 실패합니다 (그래도 쓰레기가 나옵니다). "암호 해독 안함"이라고 말하면 실제 증상은 무엇입니까? –
CCCrypt (kCCDecrypt)가 실행 된 후 numBytesEncrypted (이름을 numBytesDecrypted로 바꿔야 함)는 0이고 szPlainText는 비어 있으며 결과는 = 0/kCCSuccess입니다. – WebDrive
좀 더 살펴 봤는데 응용 프로그램 'A', 암호화 응용 프로그램, OSX 10.7 배포/baseSDK 및 응용 프로그램 'B, 복호화 응용 프로그램을 대상으로하는 응용 프로그램과 관련이있는 것처럼 보입니다. OSX 10.9 배포를 대상으로합니다./baseSDK; @ RoNNapier, 그게 문제를 일으킬 수 있습니까? – WebDrive