【问题标题】:Can't decrypt the AES cipher text无法解密 AES 密文
【发布时间】:2012-08-07 13:57:08
【问题描述】:

编辑2 这个问题已经解决了。答案是关于my other question。感谢Hot Licks。

-------- 单独编辑------------------------- ----------

Edit1:我确定我的密文和密钥是正确的。因为我同事用C++解密,没问题。顺便说一下,是ECB模式。

我在这个问题上努力了一个星期,但我仍然无法解决它。我现在真的不知道该怎么办。

我正在开发一个 cocoa 应用程序,我的服务器返回一个 AES 加密的密文给我。我必须解密这个密文以获得一些信息才能进行下一步。

我的密文是:

NSString *aesString = @"8DFE2F9A9384573FA0FFAE17C3BEF4CC2BA056CC5CBBFAB57AC78C83AF4EF8A48EA1728D904E87613845377821E01E07CC6C9DEA35516DC595421E0FFC7CAA7A19671E713BB74D84D1DD4FB2C972DD8FACF5D74AD32662E992EA13D2417ABCAEE4137098322394BA76BADBAF4C1DB344704BBF9ED8A1513FF4B2E766526C98A2808B7AE67D1866CB9B489764E70662B1499D8D467A8817D1304AAB8F92EBDDD3E871CC1374CAE96A1428F0C2AFCB3F43E705CDD7649BDE5A363D59125980D0ACBBE32879B96AB15E93F74C08D435B787A8EE734E2773E16AE8F4CB4A5DDAD989F92CF1C609F0F8B81FEDB67F974AE583548B13C86B6FE1925A33A47CBDA8ED54C20F2D8020650BA7FABBF8CBAC00493B6DE423880EF1A1AF8CDDC457C064CD6150AA30D34456E422EA707C313C7FBB428CE1C4E534EA8EDD8C21B62D526522606E6944C4058E631DAFC6F9A539F9A4DFD8AFECCEF51A8A4904A3EFA0A76F3CA55AB56C726B0787D9EBB261CA91F5ABBF985096B327A6269399AC11A23CAFB0B3A6B3FB4AA357FC1644C89B7DEE396C51AF734738E598B765B2384EB8931F4B65D9F4B6C73EE3F1F6C5AA17871D14335153E4058AB9BC0FCAD35DBDB924D00B0A71B985E20CDF530FA5479E2DD8F14D269CE59DA365BAC03FCCB037963E7E3F175A09DD7EFC66E450DF5A16E7233EA55009E4891EF238D003D5837F077C12167428AD19D3DA45D569AA252D5FFD736E134AD3B5654FD82506822BE9B78731C9CA5EE56685153E657E8B385013FF14BBE5A1F5938801E94FE498495C2D94C84A937E1C36A4667A16DFECED471C3902B4B3D1DAA9F2C72A09AF736EF51EBE39F0006667D60DDC9EC20C5C29CC8933E5FB9E293560DB6B152DF4864BD9CF02B0D40D5B24D0326F1D7E251A0CBC692B68FA37212A57F34588D18D6F4F7E59D997A8C4B5E452FE883645B90BD7EE3A4B38754616CA7A9D430620036DBEAD2EC03BEBB5C69E92F9A33951C22E83E68DD85350C7";

我的关键是:

NSString *key = @"810B16E3541EF7A4";

我使用nicerobot'answer 来解密我的密文并尝试许多其他方法。我希望有人能告诉我下一步该怎么做。

【问题讨论】:

  • 向我们展示你的尝试(你做过的最成功的尝试)
  • 至少在我的理解中,大多数 AES 算法输出的密文是纯二进制的,根本不是文本的,你正在做的是试图解密一个字符串,而不是实际的二进制输出
  • 我认为您的 aesString 未正确加密。您应该使用以下命令检查解密:cryptool-online.org/index.php?Itemid=135。也许 aesString 是 base64 编码的?
  • 提示:如果您在加密方面“咬牙切齿”,请先在单个程序中进行端到端加密/解密,然后再尝试从其他来源解密某些内容。

标签: objective-c ios cocoa aes encryption


【解决方案1】:

使用以下代码将您的加密字符串文本转换为 NSData 对象。

NSData* stringData = [encryptedStringText dataUsingEncoding:NSUTF8StringEncoding];

为 NSData 创建如下所示的类别,然后使用它对 NSData 内容进行 AES 解密。

NSData* unencryptedData = [stringData AES256DecryptWithKey:keyText];

将您的 NSData 对象转换为 NSString。

NSString* unencryptedStringText = [NSString stringWithUTF8String:[unencryptedData bytes]];

#pragma mark -
#pragma mark NSData Encryption Category

// ---------------------------------------------------------
// NSData Category to add Encryption
// ---------------------------------------------------------

@interface NSData (NSDataAESEncryption)
- (NSData *)AES256EncryptWithKey:(NSString *)key;
- (NSData *)AES256DecryptWithKey:(NSString *)key;
@end



@implementation NSData (NSDataAESEncryption)

- (NSData *)AES256EncryptWithKey:(NSString *)key {

    char keyPtr[kCCKeySizeAES256+1]; 

    bzero(keyPtr, sizeof(keyPtr)); 

    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSInteger dataLength = [self length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES256,
                                          NULL ,
                                          [self bytes], dataLength, 
                                          buffer, bufferSize, 
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }

    free(buffer); 

    return nil;
}

- (NSData *)AES256DecryptWithKey:(NSString *)key {

    char keyPtr[kCCKeySizeAES256+1]; 

    bzero(keyPtr, sizeof(keyPtr)); 

    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSInteger dataLength = [self length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES256,
                                          NULL ,
                                          [self bytes], dataLength, 
                                          buffer, bufferSize, 
                                          &numBytesDecrypted);

    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }

    free(buffer);

    return nil;
}


@end

【讨论】:

    【解决方案2】:

    AES 接受一个初始化向量。那你用什么?

    如果数据采用 Hex 或 Base64 格式,我在您的密钥中看不到足够的位用于 AES-128(最短的那种)。如果密钥是十六进制字符串的 Ascii 文本,那将是 128 位,但这似乎有点做作。这样的事情会发生,但它不会是我的第一选择。

    AES 以多种不完全兼容的模式进行加密,CBC 和 ECB 是我使用过的两种。

    不管怎样,我在这个问题上胡闹了 15 分钟,除了垃圾,我什么也得不到。我必须同意 HotLicks 的建议,他建议您从在同一程序中运行的加密/解密开始。

    祝你好运, /鲍勃·布莱恩

    【讨论】:

      【解决方案3】:

      试试这个

      + (NSData *)doCipher:(NSData *)dataIn
                    iv:(NSData *)iv
                   key:(NSData *)symmetricKey
               context:(CCOperation)encryptOrDecrypt // kCCEncrypt or kCCDecrypt
                 error:(NSError **)error
      {
          CCCryptorStatus ccStatus   = kCCSuccess;
          size_t          cryptBytes = 0;
          NSMutableData  *dataOut    = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128];
      
          ccStatus = CCCrypt( encryptOrDecrypt,
                         kCCAlgorithmAES128,
                         0, //kCCOptionPKCS7Padding,
                         symmetricKey.bytes,
                         kCCKeySizeAES128,
                         iv.bytes,
                         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;
      }
      

      【讨论】:

      • 这是this SO answer 的字符副本,除了0 用于无归属的填充。
      猜你喜欢
      • 2011-01-08
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 2019-04-07
      • 1970-01-01
      • 2011-10-10
      • 2011-03-27
      相关资源
      最近更新 更多