Шифрование выполняется с помощью 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
:
[ -74545279, -553931361, -1590906567, 1562838103 ]
fb8e8781defbad9fa12cb1395d270457
+46Hgd77rZ+hLLE5XScEVw==
Значение переменной iv
:
[ -2104361200, 2121894441 ]
8291ff107e798a29
gpH/EH55iik=
Значение переменной cipherText
:
[ 1789401157, -1485204800, -440319203, 17593459146752 ]
6aa81845a77992c0e5c1431d4be2
aqgYRad5ksDlwUMdS+I=
Вопрос:
Как я могу расшифровать зашифрованный текст с помощью Bouncy Castle ?
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.