1

私はしばらくの間復号化に取り組んできましたが、それを機能させることができません。次のコードを使用して暗号化すると:

private static string Decrypt(string plainText, string completeEncodedKey, int keySize)
  {
    RijndealManaged aesEncryption = new RijndealManaged();
    aesEncryption.KeySize = keySize; //keySize is 256
    aesEncryption.BlockSize = 128;
    aesEncryption.Mode = CipherMode.CBC;
    aesEncryption.Padding = PaddingMode.PKCS7;
    aesEncryption.IV = Convert.FromBase64String(ASCIIEncoding.ACSII.GetString(Convert.FromBase64String(completeEncodedString)).Split(',')[0]);
    aesEncryption.Key = Convert.FromBase64String(ASCIIEncoding.ACSII.GetString(Convert.FromBase64String(completeEncodedString)).Split(',')[1]);
    byte[] plainText = Encoding.UTF8.GetBytes(plainStr);
    ICryptoTransform crypto = aesEncryption.CreateEncryptor();
    byte[] cipherText = crypto.TransformFinalBlock(plainText, 0, plainText.Length);
    return Convert.ToBase64String(cipherText);
  }

取得したプレーンテキストとして「Anthony」という名前を渡しますuRO2DBKAhFsOed/p10dz+w==

を使用して復号化します

-(NSData *)AES256DecryptWithKey:(NSString *)key{
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero( keyPtr, sizeof( keyPtr ) ); // fill with zeroes (for padding)

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

NSUInteger dataLength = [self length];

//See the doc: For block ciphers, the output size will always be less than or 
//equal to the input size plus the size of one block.
//That's why we need to add the size of one block here
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc( bufferSize );

size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt( kCCDecrypt, kCCAlgorithmAES128,kCCOptionPKCS7Padding,
                                      keyPtr, kCCKeySizeAES256,
                                      NULL/* initialization vector (optional) */,
                                      [self bytes], dataLength, /* input */
                                      buffer, bufferSize, /* output */
                                      &numBytesDecrypted);

if(cryptStatus == kCCSuccess){
    //the returned NSData takes ownership of the buffer and will free it on deallocation
    return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}

free( buffer ); //free the buffer
return nil;
}

しかし、私は何の見返りも得ません。コードがif(cryptStatus == kCCSuccess){行までたどり着き、if文には入らない。したがって、復号化は返されnilます。

これが機能しない理由についての助けは素晴らしいでしょう。ありがとう。

4

1 に答える 1

0

したがって、ここにはいくつかの問題があると思います。

  1. 暗号化時に IV を指定していますが、復号化時には NULL のままにしています。IV がオプションであることは事実ですが、暗号化と復号化には同じものを使用する必要があります。

  2. 復号化するときにキーを正しく解析していないと確信しています。私が知る限り、サーバー上で (何らかの理由で) 二重の base64 でエンコードされた文字列を使用しているようです。少なくとも、これはあなたがそれを使ってやっているのを見ています:

    1. Base64 decoding the string.
    
    2. Splitting the resulting string on ','.
    
    3. Taking the first part of the split, base64 decoding it again to use as the IV.
    
    4. Taking the second part of the split, base64 decoding it again to use as the key.
    

    Obj-C コードでこれらのことを行っていません。また、キーを同じ形式で取り込んでいると仮定すると、そうする必要があります。Obj-C コードで行っていることは、NSString オブジェクトを取得して C 文字列に変換することだけです。

于 2012-07-17T20:30:08.133 に答える