解密文本iOS

时间:2013-09-03 03:52:03

标签: ios encryption aes rijndaelmanaged

如何解密作为服务器响应的文本。

我有以下参数用于使用Rijndael AES算法加密字符串。

passPhrase =“Jxy37Kn @” saltValue =“M9!1lj5” hashAlgorithm =“SHA1” passwordIterations = 2 //整数 initVector =“@ 1B2c3D4e5F6g7H8” keySize = 256 //整数

我从服务器获取的文字是jp9VG27FQYXh + Uvkc9meFw ==

有人可以通过指向一些示例来帮助我解密iOS中的上述文本 代码。

我使用以下代码

const CCAlgorithm kAlgorithm = kCCAlgorithmAES128;
const NSUInteger kAlgorithmKeySize = kCCKeySizeAES256;
const NSUInteger kAlgorithmBlockSize = kCCBlockSizeAES128;
const NSUInteger kPBKDFRounds = 2;

- (NSData *)AESKeyForPassword:(NSString *)password
                     salt:(NSData *)salt {

NSMutableData *derivedKey = [NSMutableData dataWithLength:kAlgorithmKeySize];

int result = CCKeyDerivationPBKDF(kCCPBKDF2,        // algorithm
                              password.UTF8String,  // password
                              password.length,      // passwordLength
                              salt.bytes,           // salt
                              salt.length,          // saltLen
                              kCCPRFHmacAlgSHA1,  // PRF
                              kPBKDFRounds,         // rounds
                              derivedKey.mutableBytes, // derivedKey
                              derivedKey.length);   // derivedKeyLen

// Do not log password here
NSAssert(result == kCCSuccess,
         @"Unable to create AES key for password: %d", result);

return derivedKey;
}

- (void) decryptText
{
NSData *data = [NSData dataFromBase64String:@"jp9VG27FQYXh+Uvkc9meFw=="];
NSData *iv = [@"@1B2c3D4e5F6g7H8" dataUsingEncoding:NSUTF8StringEncoding];
NSData *salt = [@"M9!1lj5" dataUsingEncoding:NSUTF8StringEncoding];

NSData *key = [self AESKeyForPassword:@"Jxy37Kn@" salt:salt];

size_t outLength;
NSMutableData *cipherData = [NSMutableData dataWithLength:data.length + kAlgorithmBlockSize];

CCCryptorStatus result = CCCrypt(kCCDecrypt, // operation
                 kAlgorithm, // Algorithm
                 kCCOptionECBMode, // options
                 key.bytes, // key
                 key.length, // keylength
                 iv.bytes,// iv
                 data.bytes, // dataIn
                 data.length, // dataInLength,
                 cipherData.mutableBytes, // dataOut
                 cipherData.length, // dataOutAvailable
                 &outLength); // dataOutMoved

if (result == kCCSuccess) {
    cipherData.length = outLength;
}
else {

}

NSString *apptStr = [[NSString alloc] initWithData:cipherData encoding:NSASCIIStringEncoding];
NSLog(@"apptStr:%@",apptStr);

}

我在解密“#Ï¢K'xÞ#É¢ç”之后得到这个,我认为这是不正确的。我在这里想念的是什么?

1 个答案:

答案 0 :(得分:0)

你不应该解密sha1哈希。它们被设计为单向加密!相反,如果您需要密码,让我们说进行身份验证,您应该让用户输入密码信息,然后将其发送到服务器然后哈希文本的服务器。然后它应该检查您发送到服务器的密码(现在已经散列),而不是之前已经散列过的版本,如果有效,则返回给您的应用程序“成功”消息。由于sha1始终是相同的算法,它应该匹配!

注意:如果您只能收到密码短语,并且无法更改密码管理方式,您可以通过sha1 hashing in objective-c执行相同的操作并与密码进行比较。