목표 -c에서 최대 크기가 20 바이트 인 UTF String을 암호화하고 base64로 인코딩하는 가장 좋은 방법/접근 방법은 무엇입니까? 나는 8 바이트 블록 크기 때문에 Blowfish쪽으로 기울어 져있다.암호화 8 바이트 문자열/base64 인 코드/최대 길이 20 바이트
몇 가지 샘플 코드를 제공해주십시오. 감사.
목표 -c에서 최대 크기가 20 바이트 인 UTF String을 암호화하고 base64로 인코딩하는 가장 좋은 방법/접근 방법은 무엇입니까? 나는 8 바이트 블록 크기 때문에 Blowfish쪽으로 기울어 져있다.암호화 8 바이트 문자열/base64 인 코드/최대 길이 20 바이트
몇 가지 샘플 코드를 제공해주십시오. 감사.
예.
DES, 3DES 및 Blowfish의 블록 크기는 8 바이트이므로 암호화 된 출력은 8 바이트가되고 Base64 인코딩의 8 바이트는 12 바이트가됩니다.
AES의 블록 크기는 16이므로 8 바이트 + 패딩은 16 바이트 데이터입니다. Base64 인코딩 16 바이트는 24 바이트가되므로 AES는 작동하지 않습니다.
CBC 모드 및 iv와 같은 다른 문제가있는 경우 좋은 방법은 임의의 IV를 사용하여 암호화 된 메시지로 전송하는 것입니다. Base64의 나머지 비트를 사용하여 부분을 전송할 수 있습니다. iv. 그러나 이것은 과거의 문제입니다.
AES는 현재 선호되는 대칭 암호화 알고리즘입니다. DES는 새로운 작업에 더 이상 권장되지 않으며 몇 가지 알려진 약점이 있습니다. 복어는 또한 권장하지 않지만 그것을 좋아하는 사람들은 DES보다 낫습니다.
다음은 64 비트 키와 iv가없는 8 바이트 데이터를 사용한 예입니다. 3DES는 Blowfish 상수를 3DES로 대체하고 24 바이트 키로 사용할 수 있습니다. 이는 권장되는 솔루션이 아니므로 좋은 솔루션은 사용법, 원하는 보안, 데이터 값 및 잠재적 인 공격자 (예 : iv 및 키)를 고려해야합니다.
+ (NSData *)doCipher:(NSData *)dataIn
iv:(NSData *)iv
key:(NSData *)symmetricKey
context:(CCOperation)encryptOrDecrypt
error:(NSError **)error
{
CCCryptorStatus ccStatus = kCCSuccess;
size_t cryptBytes = 0; // Number of bytes moved to buffer.
NSMutableData *dataOut = [NSMutableData dataWithLength:dataIn.length];
ccStatus = CCCrypt(encryptOrDecrypt,
kCCAlgorithmBlowfish,
0,
symmetricKey.bytes,
kCCKeySizeMinBlowfish,
nil,
dataIn.bytes, dataIn.length,
dataOut.mutableBytes, dataOut.length,
&cryptBytes);
if (ccStatus == kCCSuccess) {
dataOut.length = cryptBytes;
}
else {
if (error) {
*error = [NSError errorWithDomain:@"kEncryptionError"
code:ccStatus
userInfo:nil];
}
dataOut = nil;
}
return dataOut;
}
시험
: 나는 클래스 이름Test
에 위의 방법을 떨어졌다.
uint8_t keyBytes[] = {0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18};
NSData *key = [NSData dataWithBytes:keyBytes length:8];
uint8_t dateBytes[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
NSData *data = [NSData dataWithBytes:dateBytes length:8];
NSLog(@"data: %@", data);
NSError *error;
NSData *encryptData = [Test doCipher:data iv:nil key:key context:kCCEncrypt error:&error];
NSString *encryptString = [encryptData base64EncodedStringWithOptions:0];
NSLog(@"encryptData: %@", encryptData);
NSLog(@"encryptString: %@", encryptString);
NSData *decryptData = [Test doCipher:encryptData iv:nil key:key context:kCCDecrypt error:&error];
NSLog(@"decryptData: %@", decryptData);
출력 :
data: 01020304 05060708 encryptData: 9e8ec0a8 71ab9d10 encryptString: no7AqHGrnRA= decryptData 01020304 05060708
확인. iOS에서 RNCryptor 라이브러리를 사용해 보셨습니까? Blowfish 8 바이트 블록을 사용하도록 라이브러리를 구성하려고하지만 출력은 항상 8 바이트가 아닌 27 바이트입니다. – bickster
그냥 Common Crypto를 사용하십시오. RNCryptor는 훌륭한 라이브러리이며 실제 보안 기능을 포함하고 있지만 20 바이트로는 얻을 수 없습니다. 답에 추가 된 참조 예를 참조하십시오. – zaph
예제 코드를 제공해 주셔서 감사합니다. 예제 코드에서 iv를 사용하지 않는 이유는 무엇입니까? – bickster
당신은 그것에 대해 몇 가지 보안을 희생해야합니다. 적절한 크기의 MAC 및 IV를 넣을 공간이 충분하지 않습니다. 수당을 32 자로 늘리면 많은 도움이됩니다. – CodesInChaos