无法使用slowaes(javascript)解密密文 [英] Unable to decrypt aes ciphertext with slowaes (javascript)

查看:146
本文介绍了无法使用slowaes(javascript)解密密文的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个使用AesManaged .Net类编码的密码。



明文:string



password:password



这是我用来加密的c#代码:

 私人AesManaged AESCipher; 
private String Password;

public AES(String Password)
{
this.AESCipher = new AesManaged();
this.AESCipher.Mode = CipherMode.CBC;
this.AESCipher.Padding = PaddingMode.PKCS7;
this.AESCipher.IV = HexStringToByteArray(000102030405060708090A0B0C0D0E0F);
this.AESCipher.KeySize = 256;
this.AESCipher.BlockSize = 128;
this.Iterations = 1000;
this.Salt = System.Text.Encoding.ASCII.GetBytes(saltsalt);
this.Password =密码;
}

public String Encrypt(String PlainText)
{
this.AESCipher.Key = GenerateKey();
byte [] plainTextBytes = System.Text.Encoding.ASCII.GetBytes(PlainText);
ICryptoTransform transform = this.AESCipher.CreateEncryptor();
return Convert.ToBase64String(transform.TransformFinalBlock(plainTextBytes,0,plainTextBytes.Length));
}

public String Decrypt(String CipherText)
{
this.AESCipher.Key = GenerateKey();
byte [] cipherTextBytes = Convert.FromBase64String(CipherText);
ICryptoTransform transform = this.AESCipher.CreateDecryptor();
return System.Text.Encoding.ASCII.GetString(transform.TransformFinalBlock(cipherTextBytes,0,cipherTextBytes.Length));
}

私有静态字符串ByteArrayToHexString(byte [] b)
{
System.Text.StringBuilder sb1 = new System.Text.StringBuilder();
int i = 0; (i = 0; i {
sb1.Append(System.String.Format({0:X2},b [i] ));
}
return sb1.ToString()。ToUpper();
}

private static byte [] HexStringToByteArray(string s)
{
var r = new byte [s.Length / 2]; (int i = 0; i {
r [i / 2] =(byte)Convert.ToInt32(s.Substring(i ,2),16);
}
return r;
}

private byte [] GenerateKey()
{
var rfc2898 = new System.Security.Cryptography.Rfc2898DeriveBytes(this.Password,this.Salt,this .Iterations);
return rfc2898.GetBytes(this.KeySizeInBits / 8);
}

当使用slowAES和pbkdf2进行解密时,解密的字符串不正确。 p>

密文(base64)是:MJ8gxKkUKU / S + CgLPf8Sjg ==



返回的解密文本是:supkj



我的JavaScript是:

  function asciiToByteArray (s)
{
var r = Array(s.length);
for(var i = 0; i< s.length; i ++)
{
r [i] = s.charCodeAt(i);
}
return r;
}

函数byteArrayToAscii(a){
var r =; (var i = 0; i< a.length; i ++){
r + = String.fromCharCode(a [i]);

}
return r;
}

函数hexStringToByteArray(s){
try {hexcase} catch(e){hexcase = 0; }
var hex_tab = hexcase? 0123456789ABCDEF:0123456789abcdef;
var r = Array(s.length / 2); $ var $($ i $ = 2; i r [i / 2] = parseInt(s.substr(i,2),16)
}
return r;
}

函数byteArrayToHexString(a){
try {hexcase} catch(e){hexcase = 0; }
var hex_tab = hexcase? 0123456789ABCDEF:0123456789abcdef;
var r =;
for(var i = 0; i var b = hex_tab.charAt((a [i]>>>> 4)& 0x0F)+
hex_tab.charAt(a [i]& 0x0F);
r + = b;
}
return r;
}



var mypbkdf2 = new PBKDF2(password,saltsalt,1000,32);
var newKey;
var status_callback = function(percent_done){
document.getElementById(status)。innerHTML =Computed+ percent_done +%
};
var result_callback = function(key){
document.getElementById(status)。innerHTML =派生密钥是:+ key
newKey = key;

var bytes = cryptoHelpers.base64.decode(document.getElementById(string)。innerHTML);

var result = slowAES.decrypt(bytes,6,slowAES.modeOfOperation.CBC,hexStringToByteArray(key),32,000102030405060708090A0B0C0D0E0F)
alert(byteArrayToAscii(result));


};
mypbkdf2.deriveKey(status_callback,result_callback);

任何人都可以看到我做错了什么?



非常感谢

解决方案

我可以点数回答我自己的问题吗?



我发现在JavaScript中,我将IV作为HEX字符串而不是char数组传递。

  var result = slowAES.decrypt(bytes,6,slowAES.modeOfOperation.CBC,hexStringToByteArray(key),32,000102030405060708090A0B0C0D0E0F)

应该是

  var result = slowAES.decrypt(bytes,6,slowAES.modeOfOperation。 CBC,hexStringToByteArray(key),32,hexStringToByteArray(000102030405060708090A0B0C0D0E0F))


I have a cipher text I encoded with the AesManaged .Net classes.

plaintext: "string"

password: "password"

this is the c# code I use to encrypt:

private AesManaged AESCipher;
    private String Password;

    public AES(String Password)
    {
        this.AESCipher = new AesManaged();
        this.AESCipher.Mode = CipherMode.CBC;
        this.AESCipher.Padding = PaddingMode.PKCS7;
        this.AESCipher.IV = HexStringToByteArray("000102030405060708090A0B0C0D0E0F");
        this.AESCipher.KeySize = 256;
        this.AESCipher.BlockSize = 128;
        this.Iterations = 1000;
        this.Salt = System.Text.Encoding.ASCII.GetBytes("saltsalt");
        this.Password = Password;
    }

    public String Encrypt(String PlainText)
    {
        this.AESCipher.Key = GenerateKey();
        byte[] plainTextBytes = System.Text.Encoding.ASCII.GetBytes(PlainText);
        ICryptoTransform transform = this.AESCipher.CreateEncryptor();
        return Convert.ToBase64String(transform.TransformFinalBlock(plainTextBytes, 0, plainTextBytes.Length));
    }

    public String Decrypt(String CipherText)
    {
        this.AESCipher.Key = GenerateKey();
        byte[] cipherTextBytes = Convert.FromBase64String(CipherText);
        ICryptoTransform transform = this.AESCipher.CreateDecryptor();
        return System.Text.Encoding.ASCII.GetString(transform.TransformFinalBlock(cipherTextBytes, 0, cipherTextBytes.Length));
    }

    private static string ByteArrayToHexString(byte[] b)
    {
        System.Text.StringBuilder sb1 = new System.Text.StringBuilder();
        int i = 0;
        for (i = 0; i < b.Length; i++)
        {
            sb1.Append(System.String.Format("{0:X2}", b[i]));
        }
        return sb1.ToString().ToUpper();
    }

    private static byte[] HexStringToByteArray(string s)
    {
        var r = new byte[s.Length / 2];
        for (int i = 0; i < s.Length; i += 2)
        {
            r[i / 2] = (byte)Convert.ToInt32(s.Substring(i, 2), 16);
        }
        return r;
    }

    private byte[] GenerateKey()
    {
        var rfc2898 = new System.Security.Cryptography.Rfc2898DeriveBytes(this.Password, this.Salt, this.Iterations);
        return rfc2898.GetBytes(this.KeySizeInBits/8);
    }

When I decrypt with slowAES and pbkdf2 the decrypted string is not correct.

The cipher text (base64) is : "MJ8gxKkUKU/S+CgLPf8Sjg=="

the decrypted text returned is: "supkj`"

My JavaScript is:

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;
    }



    var mypbkdf2 = new PBKDF2("password", "saltsalt", 1000, 32);
    var newKey;
    var status_callback = function(percent_done) {
        document.getElementById("status").innerHTML = "Computed " + percent_done + "%"
    };
    var result_callback = function(key) {
        document.getElementById("status").innerHTML = "The derived key is: " + key
        newKey = key;

        var bytes = cryptoHelpers.base64.decode(document.getElementById("string").innerHTML);

        var result = slowAES.decrypt(bytes, 6, slowAES.modeOfOperation.CBC, hexStringToByteArray(key), 32, "000102030405060708090A0B0C0D0E0F")
        alert(byteArrayToAscii(result));


    };
    mypbkdf2.deriveKey(status_callback, result_callback);

Can anyone see what I'm doing wrong?

Many Thanks

解决方案

Ok do I get points for answering my own question?

I spotted that in the JavaScript I was passing the IV as a HEX string instead of a char array.

var result = slowAES.decrypt(bytes, 6, slowAES.modeOfOperation.CBC, hexStringToByteArray(key), 32, "000102030405060708090A0B0C0D0E0F")

should be

var result = slowAES.decrypt(bytes, 6, slowAES.modeOfOperation.CBC, hexStringToByteArray(key), 32, hexStringToByteArray("000102030405060708090A0B0C0D0E0F"))

这篇关于无法使用slowaes(javascript)解密密文的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆