Ios 带iv的AES128 CTR加密
我想用iv和键实现AES128 CTR。我正在寻找任何建议,如何做到最好的方式,而不是重新发明车轮 我找到了很好的库,但是看起来这里不支持aes 我也测试了这个方法,但看起来这不是CTR 编辑Ios 带iv的AES128 CTR加密,ios,encryption,aes,commoncrypto,Ios,Encryption,Aes,Commoncrypto,我想用iv和键实现AES128 CTR。我正在寻找任何建议,如何做到最好的方式,而不是重新发明车轮 我找到了很好的库,但是看起来这里不支持aes 我也测试了这个方法,但看起来这不是CTR 编辑 我用了@zaph的zpproach NSData *result = [NSData cryptData:dataStr operation:kCCEncrypt mode:kCCModeCTR
我用了@zaph的zpproach
NSData *result = [NSData cryptData:dataStr
operation:kCCEncrypt
mode:kCCModeCTR
algorithm:kCCAlgorithmAES128
padding:ccNoPadding
keyLength:kCCKeySizeAES128
iv:ivHex
key:keyHex
error:&error];
但接收CCCryptorCreate状态:-4305
刚从资料中找到
@当前算法未实现常量KCCUN已实现函数。
也许你在找图书馆。它支持AES和CTR
另一个流行的crypoto库是libnaid,但我不能确定它是否支持CTR。也许您正在寻找库。它支持AES和CTR
另一个流行的crypoto库是LibNade,但我不能确定它是否支持CTR。您需要使用CommonCrypto,但不是一次性的
CCCrypt
版本,而是完整的CCCryptorCreateWithMode
,CCCryptorUpdate
,CCCryptorFinal
和CCCryptorRelease
使用模式kCCModeCTR
版本
这是我的示例代码,它可能不适合您的需要,您将不得不决定柜台(四)形式
输出:
加密:064e8073 76973eba 3192474f 9831db34
您需要使用CommonCrypto,而不是一次性的CCCrypt
版本,而是完整的CCCryptorCreateWithMode
,CCCryptorUpdate
,CCCryptorFinal
和CCCryptorRelease
使用模式kCCModeCTR
版本
这是我的示例代码,它可能不适合您的需要,您将不得不决定柜台(四)形式
输出:
加密:064e8073 76973eba 3192474f 9831db34
最好避免使用CryptoSwift,除此之外,它比基于普通加密的实现慢500到1000倍。苹果公司的通用加密软件通过了FIPS认证,因此经过了充分的审查,使用CryptoSwift在正确性和安全性方面(如定时和电源攻击)是一种冒险。最好避免使用CryptoSwift,除此之外,它比基于普通加密的实现慢500到1000倍。Apple的Common Crypto通过了FIPS认证,因此经过了充分的审查,使用CryptoSwift在正确性和安全性(如定时和电源攻击)方面抓住了机会。您是否曾尝试在单独的框架(例如在cocoa pod中)中使用Common Crypto实现加密?我在pod的伞形文件中导入非modular.h时遇到问题。有什么解决办法吗?对不起,我帮不了你。您可以检查RNCryptor是否完成了此操作,请参见@zaph我尝试使用您的方法,但出现错误CCCryptorCreate状态:-4305
(请参见编辑),您可以提供建议吗?CommonCrypto错误代码来自:kCCSuccess=0,KCCParamerameror=-4300,KCCBufferToosall=-4301,kCCMemoryFailure=-4302,kCCAlignmentError=-4303,kCCDecodeError=-4304,kCCUnimplemented=-4305,kCCOverflow=-4306,KCcNgFailure=-4307,kCCUnspecifiedError=-4308,kCCCallSequenceError=-4309,kCCKeySizeError=-4310,CTR模式缺少且需要添加到示例代码中的CCModeOptions
kccmodeoptiontr\u LE
或kccmodeoptiontr\u BE
。对于CTR模式,我忘记了这个。是的,它们已被弃用,但需要。您是否曾尝试在单独的框架中(例如在cocoa pod中)使用CommonCrypto实现加密?我在pod的伞形文件中导入非modular.h时遇到问题。有什么解决办法吗?对不起,我帮不了你。您可以检查RNCryptor是否完成了此操作,请参见@zaph我尝试使用您的方法,但出现错误CCCryptorCreate状态:-4305
(请参见编辑),您可以提供建议吗?CommonCrypto错误代码来自:kCCSuccess=0,KCCParamerameror=-4300,KCCBufferToosall=-4301,kCCMemoryFailure=-4302,kCCAlignmentError=-4303,kCCDecodeError=-4304,kCCUnimplemented=-4305,kCCOverflow=-4306,KCcNgFailure=-4307,kCCUnspecifiedError=-4308,kCCCallSequenceError=-4309,kCCKeySizeError=-4310,CTR模式缺少且需要添加到示例代码中的CCModeOptions
kccmodeoptiontr\u LE
或kccmodeoptiontr\u BE
。对于CTR模式,我忘记了这个。是的,它们不推荐使用,但需要。是否有特殊原因需要CTR模式?要获得正确的CTR并不容易,必须注意,同一个计数器值不能与同一个键一起使用。kCCAlgorithmAES 128
应该是kCCAlgorithmAES
@zaph just test-result same=/需要CTR模式有什么特殊原因吗?要使CTR正确,并不容易,必须注意不要将相同的计数器值与相同的键一起使用。kCCAlgorithmAES 128
应该是kCCAlgorithmAES
@zaph just test-结果相同=/
#import <CommonCrypto/CommonCrypto.h>
+ (NSData *)cryptData:(NSData *)dataIn
operation:(CCOperation)operation // kCC Encrypt, Decrypt
mode:(CCMode)mode // kCCMode ECB, CBC, CFB, CTR, OFB, RC4, CFB8
algorithm:(CCAlgorithm)algorithm // CCAlgorithm AES DES, 3DES, CAST, RC4, RC2, Blowfish
padding:(CCPadding)padding // cc NoPadding, PKCS7Padding
keyLength:(size_t)keyLength // kCCKeySizeAES 128, 192, 256
iv:(NSData *)iv // CBC, CFB, CFB8, OFB, CTR
key:(NSData *)key
error:(NSError **)error
{
if (key.length != keyLength) {
NSLog(@"CCCryptorArgument key.length: %lu != keyLength: %zu", (unsigned long)key.length, keyLength);
if (error) {
*error = [NSError errorWithDomain:@"kArgumentError key length" code:key.length userInfo:nil];
}
return nil;
}
size_t dataOutMoved = 0;
size_t dataOutMovedTotal = 0;
CCCryptorStatus ccStatus = 0;
CCCryptorRef cryptor = NULL;
ccStatus = CCCryptorCreateWithMode(operation, mode, algorithm,
padding,
iv.bytes, key.bytes,
keyLength,
NULL, 0, 0, // tweak XTS mode, numRounds
kCCModeOptionCTR_BE, // CCModeOptions
&cryptor);
if (cryptor == 0 || ccStatus != kCCSuccess) {
NSLog(@"CCCryptorCreate status: %d", ccStatus);
if (error) {
*error = [NSError errorWithDomain:@"kCreateError" code:ccStatus userInfo:nil];
}
CCCryptorRelease(cryptor);
return nil;
}
size_t dataOutLength = CCCryptorGetOutputLength(cryptor, dataIn.length, true);
NSMutableData *dataOut = [NSMutableData dataWithLength:dataOutLength];
char *dataOutPointer = (char *)dataOut.mutableBytes;
ccStatus = CCCryptorUpdate(cryptor,
dataIn.bytes, dataIn.length,
dataOutPointer, dataOutLength,
&dataOutMoved);
dataOutMovedTotal += dataOutMoved;
if (ccStatus != kCCSuccess) {
NSLog(@"CCCryptorUpdate status: %d", ccStatus);
if (error) {
*error = [NSError errorWithDomain:@"kUpdateError" code:ccStatus userInfo:nil];
}
CCCryptorRelease(cryptor);
return nil;
}
ccStatus = CCCryptorFinal(cryptor,
dataOutPointer + dataOutMoved, dataOutLength - dataOutMoved,
&dataOutMoved);
if (ccStatus != kCCSuccess) {
NSLog(@"CCCryptorFinal status: %d", ccStatus);
if (error) {
*error = [NSError errorWithDomain:@"kFinalError" code:ccStatus userInfo:nil];
}
CCCryptorRelease(cryptor);
return nil;
}
CCCryptorRelease(cryptor);
dataOutMovedTotal += dataOutMoved;
dataOut.length = dataOutMovedTotal;
return dataOut;
}
NSData *dataIn = [@"DataInDataInData" dataUsingEncoding: NSUTF8StringEncoding];
NSData *key = [@"KeyKeyKeyKeyKeyK" dataUsingEncoding: NSUTF8StringEncoding];
NSData *counter = [@"CounterCounterCo" dataUsingEncoding: NSUTF8StringEncoding];
NSError *error;
NSData *encrpted = [Crypto
cryptData:dataIn
operation:kCCEncrypt
mode:kCCModeCTR
algorithm:kCCAlgorithmAES
padding:ccNoPadding
keyLength:kCCKeySizeAES128
iv:counter
key:key
error:&error];
NSLog(@"encrypted: %@", encrpted);