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

标签 ios objective-c encryption rncryptor

对 Objective-C 中最大大小为 20 字节的 UTF 字符串进行加密和 Base64 编码的最佳方法/途径是什么?由于 8 字节 block 大小,我倾向于 Blowfish。

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

最佳答案

是的。

DES、3DES 和 Blowfish 的 block 大小为 8 字节,因此加密输出将为 8 字节,Base64 编码 8 字节将得到 12 字节。

AES 的 block 大小为 16,因此 8 字节 + 填充将是 16 字节的数据。 Base64 编码 16 字节将生成 24 字节,因此 AES 将不起作用。

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

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

这是一个使用 8 字节数据和 64 位 key 且没有 iv 的示例。可以通过用 Blowfish 常量替换 3DES 和 24 字节 key 来使用 3DES。这不是一个推荐的解决方案,一个好的解决方案需要考虑使用情况、所需的安全性、数据值(value)和潜在的攻击者以及其他因素,例如 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

关于ios - 加密8字节字符串/base64编码/最大长度20字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28289365/

相关文章:

ios - ASIHTTPRequest:优先处理请求

iphone - 为什么我不能在 switch 语句中使用 NSInteger?

encryption - 强制 S3 存储桶的服务器端加密

c# - Azure Key Vault .NET - 找不到方法

c++ - Debug和Release模式下的AES加密问题

iphone - 将自定义方法添加到单独文件中的 Core Data 托管对象的方法是什么?

android - Prestashop 语言标志图标在移动设备上看起来很糟糕

objective-c - 如何在第三方音乐应用程序中获取正在播放的信息?

JavaScriptCore -- 将函数作为参数传递给 ObjC

objective-c - 如何更改 Xcode 应用程序的外观?