任何人都可以告訴我爲什麼ios中的3des會在ios中每次onload時產生不同的編碼字符串?最初我將「密鑰」轉換爲md5格式的字符串,然後在3des中使用相同的密鑰來生成編碼值。ios中的3des每次在加載時提供不同的加密值?
這裏是我的代碼:
-(NSData *)tripleDesEncryptString:(NSString *)input key:(NSString*)key error:(NSError **)error{
//TDES
NSParameterAssert(input);
NSParameterAssert(key);
NSData *inputData = [input dataUsingEncoding:NSUTF8StringEncoding];
NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
size_t outLength;
//NSAssert(keyData.length == kCCKeySize3DES, @"the keyData is an invalid size");
NSMutableData *outputData = [NSMutableData dataWithLength:(inputData.length + kCCBlockSize3DES)];
CCCryptorStatus result = CCCrypt(
kCCEncrypt, // operation
kCCAlgorithm3DES, // Algorithm
kCCOptionECBMode | kCCOptionPKCS7Padding, // options
keyData.bytes, // key
keyData.length, // keylength
nil, // iv
inputData.bytes, // dataIn
inputData.length, // dataInLength,
outputData.mutableBytes, // dataOut
outputData.length, // dataOutAvailable
&outLength // dataOutMoved
);
if (result != kCCSuccess) {
if (error != NULL) {
*error = [NSError errorWithDomain:@"com.your_domain.your_project_name.your_class_name." code:result userInfo:nil];
}
return nil;
}
[outputData setLength:outLength];
return outputData;
}
-(void) testEncryptionAndDecryption {
NSString *str [email protected]"[email protected]#$%^&*()";
id md5data =[str MD5];
NSString *md5dataString =(NSString *)md5data;
NSData *encrypted = [self tripleDesEncryptString:@"[email protected]:123" key:md5dataString error:nil];
NSString *strData = [encrypted base64EncodedStringWithOptions:0];
NSLog(@"encrypted data length: %@",strData);
NSString *str2 = [[NSString alloc] initWithData:encrypted encoding:NSUTF8StringEncoding];
NSLog(@"%@",str2);
}
1.簡單的答案是因爲輸入參數不相同,檢查參數是準確的正確的長度。 2.不要使用3DES進行新的工作,它不安全,請使用AES。不要ECB模式,這是不安全的。 – zaph
**切勿使用[ECB模式](http://crypto.stackexchange.com/q/14487/13022)**。它是確定性的,因此不具有語義安全性。你應該至少是使用隨機模式,如[CBC(http://crypto.stackexchange.com/q/22260/13022)或[CTR](http://crypto.stackexchange.com/a/2378/ 13022)。最好是對密文進行身份驗證,以便像[padding oracle attack](http://crypto.stackexchange.com/q/18185/13022)這樣的攻擊是不可能的。這可以通過驗證模式(如GCM或EAX)或[加密 - 然後MAC](http://crypto.stackexchange.com/q/202/13022)方案完成。 –
其實**從不**有點強。如果你的加密數據長度恰好是一個塊(沒有填充),並且密鑰是唯一的並且隨機生成的,那麼添加IV和CBC模式就什麼都不會了。目前有些情況下,這是按照現行標準完成的。 – zaph