0

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

我有以下用于使用 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Þ#É¢ç”后得到这个,我认为这是不正确的。我在这里想念什么?

4

1 回答 1

0

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

注意:如果您只能接收密码短语,并且无法更改管理密码的架构,您可以通过在objective-c 中进行sha1 散列并与密码进行比较来做同样的事情。

于 2013-09-03T03:54:36.040 回答