Как расшифровать зашифрованный AES/CCM зашифрованный текст с помощью Bouncy Castle?

Шифрование

Шифрование выполняется с помощью Stanford Javascript Crypto Library (. SJCL ). Ниже приведен полный пример шифрования, разделенный на две части. Первый касается получения ключа на основе пароля с помощью PBKDF2 . Во второй части фактическое шифрование происходит с производным ключом и вектором инициализации (. IV ). Обратите внимание, что соль и IV жестко закодированы, чтобы было проще предоставить решение для расшифровки C #.

// Key derivation…
var password = "password";
var salt = sjcl.codec.hex.toBits(
    "5f9bcef98873d06a" // Random generated with sjcl.random.randomWords(2, 0);
);                     // Hex encoded with sjcl.codec.hex.toBits(randomSalt);
var iterations = 1000;
var keySize = 128;
var encryptionKey = sjcl.misc.pbkdf2(password, salt, iterations, keySize);

// Encryption…
var blockCipher = new sjcl.cipher.aes(encryptionKey);
var plainText = sjcl.codec.utf8String.toBits("secret");
var iv = sjcl.codec.hex.toBits("8291ff107e798a29");
var adata = ""; // What is adata?
var tag = 64; // What is tag? I think it is authentication strength.
var cipherText = sjcl.mode.ccm.encrypt(blockCipher, plainText, iv, adata, tag);

Значение переменной encryptionKey:

Значение переменной iv:

  • Битовый массив SJCL:[ -2104361200, 2121894441 ]
  • Шестнадцатеричный код:8291ff107e798a29
  • Кодировка Base64:gpH/EH55iik=

Значение переменной cipherText:

  • Битовый массив SJCL:[ 1789401157, -1485204800, -440319203, 17593459146752 ]
  • Шестнадцатеричный код:6aa81845a77992c0e5c1431d4be2
  • Кодировка Base64:aqgYRad5ksDlwUMdS+I=

Вопрос

Вопрос:

Как я могу расшифровать зашифрованный текст с помощью Bouncy Castle ?


Рабочий пример расшифровки после справки от jbtule ниже

using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Modes;
using Org.BouncyCastle.Crypto.Parameters;

namespace SjclHelpers {

    public static class Encryption {

        /// Decrypts the cipher text.
        /// The cipher text.
        /// The encryption key.
        /// The IV.
        /// The decrypted text.
        public static byte[] Decrypt(this byte[] cipherText,
            byte[] key, byte[] initializationVector) {
            var keyParameter = new KeyParameter(key);
            const int macSize = 64;
            var nonce = initializationVector;
            var associatedText = new byte [] {};
            var ccmParameters = new CcmParameters(
                keyParameter,
                macSize,
                nonce,
                associatedText);
            var ccmMode = new CcmBlockCipher(new AesFastEngine());
            var forEncryption = false;
            ccmMode.Init(forEncryption, ccmParameters);
            var plainBytes =
                new byte[ccmMode.GetOutputSize(cipherText.Length)];
            var res = ccmMode.ProcessBytes(
                cipherText, 0, cipherText.Length, plainBytes, 0);
            ccmMode.DoFinal(plainBytes, res);
            return plainBytes;
        }}}

Я получаю System.ArgumentException. Я думаю, что он жалуется на то, что один из байтовых массивов слишком короткий.

Boncy Castle доступен на сайте NuGet по этому адресу:http://nuget.org/packages/BouncyCastle.


О

Решение для расшифровки AES/CCM станет частью проекта SjclHelpers в CodePlex и будет выпущено в виде пакета NuGet.

8
задан knut 25 May 2012 в 14:40
поделиться