2015-02-03 7 views
1

목표 -c에서 최대 크기가 20 바이트 인 UTF String을 암호화하고 base64로 인코딩하는 가장 좋은 방법/접근 방법은 무엇입니까? 나는 8 바이트 블록 크기 때문에 Blowfish쪽으로 기울어 져있다.암호화 8 바이트 문자열/base64 인 코드/최대 길이 20 바이트

몇 가지 샘플 코드를 제공해주십시오. 감사.

+0

당신은 그것에 대해 몇 가지 보안을 희생해야합니다. 적절한 크기의 MAC 및 IV를 넣을 공간이 충분하지 않습니다. 수당을 32 자로 늘리면 많은 도움이됩니다. – CodesInChaos

답변

1

예.

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 
+0

확인. iOS에서 RNCryptor 라이브러리를 사용해 보셨습니까? Blowfish 8 바이트 블록을 사용하도록 라이브러리를 구성하려고하지만 출력은 항상 8 바이트가 아닌 27 바이트입니다. – bickster

+0

그냥 Common Crypto를 사용하십시오. RNCryptor는 훌륭한 라이브러리이며 실제 보안 기능을 포함하고 있지만 20 바이트로는 얻을 수 없습니다. 답에 추가 된 참조 예를 참조하십시오. – zaph

+0

예제 코드를 제공해 주셔서 감사합니다. 예제 코드에서 iv를 사용하지 않는 이유는 무엇입니까? – bickster