может быть, я могу помочь.
Я взял ваш код C # и немного его изменил. Код C #, который я использую, полностью:
using System;
using System.Security.Cryptography;
public class Bob
{
internal static string FormatByteArray(byte[] b)
{
System.Text.StringBuilder sb1 = new System.Text.StringBuilder();
int i = 0;
for (i = 0; i < b.Length; i++)
{
if (i != 0 && i % 16 == 0)
sb1.Append("\n");
sb1.Append(System.String.Format("{0:X2} ", b[i]));
}
return sb1.ToString();
}
public static void Main()
{
try
{
string original = "watson?";
Console.WriteLine("Original: {0}", original);
byte[] IV = new byte[16]; // match slowaes IV
var ascii = new System.Text.ASCIIEncoding();
// match slowaes KEY
string passPhrase = "12345678901234567890123456789012";
byte[] key = ascii.GetBytes(passPhrase);
RijndaelManaged myRijndael = new RijndaelManaged();
myRijndael.BlockSize = 128;
myRijndael.KeySize = 256;
myRijndael.IV = IV;
myRijndael.Padding = PaddingMode.PKCS7;
myRijndael.Mode = CipherMode.CBC;
myRijndael.Key = key;
// Encrypt the string to an array of bytes.
byte[] plainText = new System.Text.ASCIIEncoding().GetBytes(original);
ICryptoTransform transform = myRijndael.CreateEncryptor();
byte[] cipherText = transform.TransformFinalBlock(plainText, 0, plainText.Length);
Console.WriteLine("cipherText: {0}", FormatByteArray(cipherText));
// Decrypt the bytes to a string.
transform = myRijndael.CreateDecryptor();
plainText = transform.TransformFinalBlock(cipherText, 0, cipherText.Length);
string roundtrip = ascii.GetString(plainText);
Console.WriteLine("Round Trip: {0}", roundtrip);
}
catch (Exception e)
{
Console.WriteLine("Error: {0}", e.Message);
}
}
}
скомпилируйте вышеуказанное с
csc.exe /target:exe /out:Bob.exe Bob.cs
Я использую slowAES.wsc из другого поста, на который вы ссылались, с двумя изменениями: я не вызываю getPaddedBlock () для ключа в методах EncryptString или DecryptString (). Это действительно нуждается в PBKDF, но давайте сейчас не будем об этом беспокоиться. Вот как выглядит модифицированная EncryptString:
function EncryptString(plainText)
{
// this is really wrong - need a PBBKDF to get the key, instead
// of just using the passphrase
var key = cryptoHelpers.convertStringToByteArray(_passphrase);
// var nkey = slowAES.getPaddedBlock(key, 0, _keysize, _mode);
var bytesToEncrypt = cryptoHelpers.convertStringToByteArray(plainText);
var result = slowAES.encrypt(bytesToEncrypt,
_mode,
key,
_keysize,
_iv);
return result['cipher'];
}
Это означает, что вы должны использовать passPhrase, которая равна точно длины, требуемой размером ключа. Если вы используете AES256, то передайте 32-символьную строку (32 * 8 = 256 бит). Похоже, вы уже поняли это.
Клиент компонента WSC также является Javascript (хотя это может быть любой язык COM). Вот что я использовал.
function toHexString(a)
{
var ret = '';
for(var i = 0;i < a.length;i++)
ret += (a[i] < 16 ? '0' : '') + a[i].toString(16) + ' ';
return ret.toLowerCase();
}
//var plaintext = "Hello. This is a test. of the emergency broadcasting system.";
var plaintext = "watson?";
try
{
WScript.echo( "plaintext: " + plaintext);
WScript.echo( "plaintext.length: " + plaintext.length);
WScript.echo( "instantiate ");
var aes = new ActiveXObject("Ionic.Com.SlowAES");
WScript.echo( "keysize ");
aes.KeySize = 256;
WScript.echo( "passphrase ");
aes.PassPhrase= "12345678901234567890123456789012"; // 32 chars long
WScript.echo( "mode ");
aes.Mode = "CBC";
WScript.echo( "encrypting... ");
var result = aes.EncryptString(plaintext);
WScript.echo( "Cryptotext: " + toHexString(result));
WScript.echo( "decrypting... ");
var decrypted = aes.DecryptBytesToString(result);
WScript.echo( "decrypted: " + decrypted);
}
catch(e)
{
WScript.echo("Exception: " + e);
// WScript.echo(e.Number + ": " + e.Name);
WScript.echo(e.Message);
}
Если затем запустить этот код, Javascript и C # создадут один и тот же текст шифра для открытого текста «watson?», Используя AES256, кодовую фразу 12345678901234567890123456789012 и IV из 16 байтов, равных нулю. Сгенерированный зашифрованный текст:
8B 68 A6 23 08 2A D8 A0 EB 99 17 8F 69 03 18 FF
Он успешно расшифровывает в обоих случаях.
EDIT : Несмотря на то, что я упаковал медленное шифрование AES в WSC, оно будет совместимо и вне среды COM. Часть WSC не нужна для этого вопроса, но была необходима для демонстрации ответа на предыдущий вопрос: « как мне заставить VBScript и .NET AES взаимодействовать? »
EDIT2 : Исходный код, демонстрирующий взаимодействие AES между Javascript или VBScript и .NET , доступен . Я расширил базовый пример, приведенный здесь, для создания тестовых приложений на 3 языках: C #, Javascript и VBScript. Все они принимают один и тот же набор аргументов. Каждый из них использует RFC2898-совместимую функцию получения ключа. Вы можете указать пароль, соль, IV и открытый текст, а также количество итераций RFC2898 для использования в PBKDF2. Вы можете легко убедиться, что зашифрованный текст одинаков для каждой из этих тестовых программ. Возможно, пример будет кому-то полезен.
EDIT3
хорошее прочтение: Криптография Javascript считается вредной.