当前位置: 首页 > 知识库问答 >
问题:

使用vb.net aes/cbc加密字符串,需要使用JavaScript CryptoJS解密

沙星波
2023-03-14
Dim encryptedComplianceValue = encrypt2(complianceValue, "Password", "Salt Value", "SHA1", 2, "@1B2c3D4e5F6g7H8", 256)

加密方法

Public Function encrypt2(ByVal plainText As String, ByVal passPhrase As String, ByVal saltValue As String, ByVal hashAlgorithm As String, ByVal passwordIterations As Integer, ByVal initVector As String, ByVal keySize As Integer) As String

    Dim initVectorBytes As Byte()
    initVectorBytes = Encoding.ASCII.GetBytes(initVector)

    Dim saltValueBytes As Byte()
    saltValueBytes = Encoding.ASCII.GetBytes(saltValue)

    Dim plainTextBytes As Byte()
    plainTextBytes = Encoding.UTF8.GetBytes(plainText)

    Dim password As Rfc2898DeriveBytes
    password = New Rfc2898DeriveBytes(passPhrase, saltValueBytes, passwordIterations)

    Dim keyBytes As Byte()
    keyBytes = password.GetBytes(keySize / 8)

    Dim symmetricKey As RijndaelManaged
    symmetricKey = New RijndaelManaged()

    symmetricKey.Mode = CipherMode.CBC

    Dim encryptor As ICryptoTransform
    encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes)

    Dim memoryStream As MemoryStream
    memoryStream = New MemoryStream()

    Dim cryptoStream As CryptoStream
    cryptoStream = New CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)
    cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length)
    cryptoStream.FlushFinalBlock()

    Dim cipherTextBytes As Byte()
    cipherTextBytes = memoryStream.ToArray()

    memoryStream.Close()
    cryptoStream.Close()

    Dim cipherText As String
    cipherText = Convert.ToBase64String(cipherTextBytes)

    Return cipherText
End Function

JavaScript

function decryptMsg256() 
{
    var keySize = 256;
    var iterations = 2;
    var algorithm = 'AES-256-CBC';

    // the password that user provides
    var userPass = "Password"; 
    console.log("user pass : " + userPass);

    // get the encrypted msg 
    var encMsg64 = "v6shkblimfQMOoa8VxICjQ==";
    var encMsg = CryptoJS.enc.Base64.parse(encMsg64);



    //var salt =CryptoJS.enc.Utf8.parse("Mon,07-Mar-2016 18:50:46 GMT");
    var salt = "Salt Value";
    console.log('salt:  '+ salt);
    var saltbytes = [];

    for (var i = 0; i <salt.length; ++i) {
        saltbytes .push(salt.charCodeAt(i));
    }
    console.log('saltbytes:  '+ saltbytes );

    //var iv =CryptoJS.enc.Utf8.parse("@1B2c3D4e5F6g7H8");
    var iv = "@1B2c3D4e5F6g7H8";
    console.log('IV:  '+ iv);
    var ivbytes = [];

    for (var i = 0; i <iv.length; ++i) {
        ivbytes.push(iv.charCodeAt(i));
    }
    console.log('ivbytes:  '+ ivbytes );

    //var saltBuffer = new Buffer(salt);
    //var passwordBuffer = new Buffer(userPass);

    var key = CryptoJS.PBKDF2(userPass, saltbytes,{keyBytes: 32,      iterations: 2 });
    //var key = CryptoJS.PBKDF2(userPass, salt, iterations, keySize/8);
    //var decipher = CryptoJS.createDecipheriv(algorithm, key, iv);

    console.log( 'key: '+ key);
    var keybytes = [];

    for (var i = 0; i <key.length; ++i) {
        keybytes.push(key.charCodeAt(i));
    }
    console.log('keybytes:  '+ keybytes);


    //var plainText="Hello, World!";

    //console.log('Plain Text  '+ plainText );

    //var encMsg = CryptoJS.AES.encrypt(plainText, key,  {
         //               iv:iv,
          //            mode: CryptoJS.mode.CBC,
           //             padding: CryptoJS.pad.Pkcs7
    //      });


    //console.log('Encrypted Message  '+ encMsg );




    var decText = '';

    var decMsg = CryptoJS.AES.decrypt( encMsg, key, {
                    iv:iv,
                    mode: CryptoJS.mode.CBC,
                    //padding: CryptoJS.pad.Pkcs7
                    } );
    //console.log( "decryptedData = " + decMsg );

    // convert to UTF8 string
    decText = decMsg.toString( CryptoJS.enc.Utf8);
    console.log( "decryptedText = " + decText );

}

共有1个答案

水昊阳
2023-03-14

您有多个问题:

>

  • 您的IV是一个简单的ASCII字符串,因此您可以使用

    var iv = CryptoJS.enc.Utf8.parse("@1B2c3D4e5F6g7H8");
    

    不要将您的自定义“二进制”格式与SaltBytes.Push(Salt.CharCodeat(i));或类似格式一起使用。您需要使用CryptoJS的本机格式,该格式可通过以下方式获得

    CryptoJS.enc.<Encoder>.parse(string)
    
    var key = CryptoJS.PBKDF2(userPass, salt, {keySize: 256/32,      iterations: 2 });
    
    var decMsg = CryptoJS.AES.decrypt({
        ciphertext: encMsg
    }, key, {
        iv: iv
    });
    

  •  类似资料:
    • 我一直在到处寻找一些示例代码,介绍如何使用Bouncy Castle框架用标题中的加密加密一个简单的字符串。 此代码将在Windows Universal项目上运行。我以前尝试使用内置API进行加密,但在服务器上解密失败。 服务器使用 但失败的原因是: 填充无效,无法删除。 初始化向量的长度必须与块大小相同 服务器上的长度为128。我怎么能强迫它是等长的?

    • 我想使用chacha20解密和加密字符串 BouncyCastleProvider正在使用chacha20技术。所以我包括了罐子。并尝试了代码,但无法工作。 pbe.java

    • 本文向大家介绍.net core使用MD5加密解密字符串,包括了.net core使用MD5加密解密字符串的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了.net core使用MD5加密解密字符串的具体代码,供大家参考,具体内容如下 调用加密 解密看效果 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

    • 我的代码如下: 有人来帮我吗

    • 在PHP中,< code > MCRYPT _ get _ iv _ size(MCRYPT _ RIJNDAEL _ 256,MCRYPT _ MODE _ CBC);返回值32,因此显然表明AES-256需要32字节的初始化向量。但这是骗人的,正如< code>mcrypt_encrypt的注释中所说: 此外,不是AES-256,它是Rijndael分组密码的不同变体。如果您想要在mcrypt