Javascript中的SlowAES解密错误
我在c中有以下AES加密函数#Javascript中的SlowAES解密错误,javascript,c#,encryption,aes,Javascript,C#,Encryption,Aes,我在c中有以下AES加密函数# 公共类AES { 私人密码; 私有字符串密码; 私有整数迭代; 私有字节[]盐; 公共AES(字符串密码) { this.aesciper=新的AESSmanaged(); this.aesciper.Mode=CipherMode.CBC; this.aesciper.Padding=PaddingMode.PKCS7; this.aesciper.IV=HexStringToByteArray(“000102030405060708090A0B0C0D0E0F
公共类AES
{
私人密码;
私有字符串密码;
私有整数迭代;
私有字节[]盐;
公共AES(字符串密码)
{
this.aesciper=新的AESSmanaged();
this.aesciper.Mode=CipherMode.CBC;
this.aesciper.Padding=PaddingMode.PKCS7;
this.aesciper.IV=HexStringToByteArray(“000102030405060708090A0B0C0D0E0F”);
this.aesciper.KeySize=256;
this.aesciper.BlockSize=128;
这个。迭代次数=1000;
this.Salt=System.Text.Encoding.ASCII.GetBytes(“saltsalt”);
this.Password=密码;
}
公共字符串加密(字符串明文)
{
this.aesciper.Key=GenerateKey();
字节[]明文字节=System.Text.Encoding.ASCII.GetBytes(明文);
ICryptoTransform transform=this.aesciper.CreateEncryptor();
返回Convert.ToBase64String(transform.TransformFinalBlock(plainTextBytes,0,plainTextBytes.Length));
}
公共字符串解密(字符串密文)
{
this.aesciper.Key=GenerateKey();
byte[]cipherTextBytes=Convert.FromBase64String(密文);
ICryptoTransform transform=this.aesciper.CreateDecryptor();
返回System.Text.Encoding.ASCII.GetString(transform.TransformFinalBlock(cipherTextBytes,0,cipherTextBytes.Length));
}
私有静态字符串ByteArrayToHexString(字节[]b)
{
System.Text.StringBuilder sb1=新的System.Text.StringBuilder();
int i=0;
对于(i=0;i
通过上面的函数,我从单词“hello”中获得一个base64编码字符串“HlHY8Y2v6idG2DoDMgvR/Q==”
然后,我在Javascript中使用以下解密函数,使用slowAES库和其他类似cryptohelpers.js和pbkdf2.js的东西:
function decrypt3() {
var mypbkdf2 = new PBKDF2("password", "saltsalt", 1000, 32);
var newKey;
var result_callback = function (key) {
newKey = key;
var bytes = cryptoHelpers.base64.decode('HlHY8Y2v6idG2DoDMgvR/Q==');
var result = slowAES.decrypt(bytes, 6, slowAES.modeOfOperation.CBC, hexStringToByteArray(key), 32, hexStringToByteArray("000102030405060708090A0B0C0D0E0F"));
alert(byteArrayToAscii(result));
};
mypbkdf2.deriveKey(function () {}, result_callback);
}
function asciiToByteArray(s)
{
var r= Array(s.length);
for (var i = 0; i < s.length; i++)
{
r[i]= s.charCodeAt(i);
}
return r;
}
function byteArrayToAscii(a) {
var r = "";
for (var i = 0; i < a.length; i++) {
r += String.fromCharCode(a[i]);
}
return r;
}
function hexStringToByteArray(s) {
try { hexcase } catch (e) { hexcase = 0; }
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
var r = Array(s.length / 2);
for (var i = 0; i < s.length; i += 2) {
r[i / 2] = parseInt(s.substr(i, 2), 16);
}
return r;
}
function byteArrayToHexString(a) {
try { hexcase } catch (e) { hexcase = 0; }
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
var r = "";
for (var i = 0; i < a.length; i++) {
var b = hex_tab.charAt((a[i] >> 4) & 0x0F) +
hex_tab.charAt(a[i] & 0x0F);
r += b;
}
return r;
}
函数decrypt3(){
var mypbkdf2=新的PBKDF2(“密码”,“盐”,1000,32);
var newKey;
var result_callback=函数(键){
newKey=key;
var bytes=cryptoHelpers.base64.decode('HlHY8Y2v6idG2DoDMgvR/Q=');
var result=slowAES.decrypt(字节,6,slowAES.modeOfOperation.CBC,hexStringToByteArray(密钥),32,hexStringToByteArray(“000102030405060708090A0B0C0D0E0F”);
警报(byteArrayToAscii(结果));
};
deriveKey(函数(){},结果_回调);
}
功能asciiToByteArray(s)
{
var r=数组(s.长度);
对于(变量i=0;i>4)和0x0F)+
十六进制制表符(a[i]&0x0F);
r+=b;
}
返回r;
}
我无法解密字符串,“result”总是一个空数组,我无法理解它。谢谢你的帮助 可能是Nope的重复,问题是他将IV作为字符串而不是字节数组传递。OP没有犯同样的错误。
function decrypt3() {
var mypbkdf2 = new PBKDF2("password", "saltsalt", 1000, 32);
var newKey;
var result_callback = function (key) {
newKey = key;
var bytes = cryptoHelpers.base64.decode('HlHY8Y2v6idG2DoDMgvR/Q==');
var result = slowAES.decrypt(bytes, 6, slowAES.modeOfOperation.CBC, hexStringToByteArray(key), 32, hexStringToByteArray("000102030405060708090A0B0C0D0E0F"));
alert(byteArrayToAscii(result));
};
mypbkdf2.deriveKey(function () {}, result_callback);
}
function asciiToByteArray(s)
{
var r= Array(s.length);
for (var i = 0; i < s.length; i++)
{
r[i]= s.charCodeAt(i);
}
return r;
}
function byteArrayToAscii(a) {
var r = "";
for (var i = 0; i < a.length; i++) {
r += String.fromCharCode(a[i]);
}
return r;
}
function hexStringToByteArray(s) {
try { hexcase } catch (e) { hexcase = 0; }
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
var r = Array(s.length / 2);
for (var i = 0; i < s.length; i += 2) {
r[i / 2] = parseInt(s.substr(i, 2), 16);
}
return r;
}
function byteArrayToHexString(a) {
try { hexcase } catch (e) { hexcase = 0; }
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
var r = "";
for (var i = 0; i < a.length; i++) {
var b = hex_tab.charAt((a[i] >> 4) & 0x0F) +
hex_tab.charAt(a[i] & 0x0F);
r += b;
}
return r;
}