加密8字节字符串/ base64编码/最大长度20字节

时间:2015-02-03 00:30:06

标签: ios objective-c encryption rncryptor

对objective-c中最大为20字节的UTF字符串进行加密和base64编码的最佳方法/方法是什么?由于8字节的块大小,我倾向于Blowfish。

请提供一些示例代码?谢谢。

1 个答案:

答案 0 :(得分:2)

DES,3DES和Blowfish的块大小为8字节,因此加密输出为8字节,Base64编码8字节将产生12字节。

AES的块大小为16,因此8字节+填充将是16字节的数据。 Base64编码16字节将导致24字节,因此AES将无法工作。

还有其他问题,如CBC模式和iv,一个好的方案将使用随机iv并使用加密消息传输它。可以使用Base64中的剩余位来发送部分iv。但这已经过了问题。

AES是当前首选的对称加密算法。 DES不再推荐用于新工作,并且具有一些已知的弱键。也不推荐Blowfish,但很多人都喜欢它,它可能比DES更好。

以下是使用带有64位密钥且没有iv的8字节数据的示例。可以通过将Blowfish常量替换为3DES和24字节密钥来使用3DES。这不是推荐的解决方案,一个好的解决方案需要考虑使用,所需的安全性,数据价值和潜在的攻击者以及其他因素,如iv和key。

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