Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法使用slowaes(javascript)解密aes密文_C#_.net_Javascript_Encryption_Aes - Fatal编程技术网

C# 无法使用slowaes(javascript)解密aes密文

C# 无法使用slowaes(javascript)解密aes密文,c#,.net,javascript,encryption,aes,C#,.net,Javascript,Encryption,Aes,我有一个用AES托管的.Net类编码的密码文本 纯文本:“字符串” 密码:“密码” 这是我用来加密的c代码: private AesManaged AESCipher; private String Password; public AES(String Password) { this.AESCipher = new AesManaged(); this.AESCipher.Mode = CipherMode.CBC;

我有一个用AES托管的.Net类编码的密码文本

纯文本:“字符串”

密码:“密码”

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

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);
    }
私有密码;
私有字符串密码;
公共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
使用slowAES和pbkdf2解密时,解密的字符串不正确

密码文本(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;
    }

    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);
函数asciiToByteArray(s)
{
var r=数组(s.长度);
对于(变量i=0;i>4)和0x0F)+
十六进制制表符(a[i]&0x0F);
r+=b;
}
返回r;
}
var mypbkdf2=新的PBKDF2(“密码”,“盐”,1000,32);
var newKey;
var status\u callback=函数(完成百分比){
document.getElementById(“status”).innerHTML=“Computed”+完成百分比+”%
};
var result_callback=函数(键){
document.getElementById(“status”).innerHTML=“派生键为:”+key
newKey=key;
var bytes=cryptoHelpers.base64.decode(document.getElementById(“string”).innerHTML);
var result=slowAES.decrypt(字节,6,slowAES.modeOfOperation.CBC,hexStringToByteArray(密钥),32,“000102030405060708090A0B0C0D0E0F”)
警报(byteArrayToAscii(结果));
};
deriveKey(状态回调、结果回调);
有人能看出我做错了什么吗


非常感谢

好的,我回答自己的问题会得到分数吗

我发现在JavaScript中,我将IV作为十六进制字符串而不是字符数组传递

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"))

救命啊!我真的很想解决这个问题,但我就是想不出来!不,你回答自己的问题不会得到分数。尽管如此,由于您自己的答案回答了您的问题,您应该将其标记为答案。您可以向我提供javascript方法吗,您在其中声明了它。我正在推动钛加速装置