VBScript中的AES/Rijndael自定义密钥

5

我正在开发一个JAVA程序,它向asp文件发送请求并运行良好。

现在我想加密POST请求,但我需要在JAVA和ASP上使用相同的密钥进行正确的解密(至少我认为是这样)。

那么如何从vbscript中的字符串生成密钥?我需要自定义IV吗?我不知道什么是那个:(

(我从未加密过任何东西,我很新手)

set obj = server.CreateObject("System.Security.Cryptography.RijndaelManaged")
set utf = CreateObject("System.Text.UTF8Encoding")
s="This is a private message"
bytes=utf.GetBytes_4(s)
obj.GenerateKey()   'need to custom this
obj.GenerateIV()    'need to custom this?
set enc=obj.CreateEncryptor()
set dec=obj.CreateDecryptor()

bytec=enc.TransformFinalBlock((bytes),0,lenb(bytes))
sc=utf.GetString((bytec))
response.write sc

byted=dec.TransformFinalBlock((bytec),0,lenb(bytec))
sd=utf.GetString((byted))
response.write sd

我建议你了解一下KDF,否则你在这里可能会犯一些安全错误。 - Luke Joshua Park
为什么客户端是Java,而服务器却使用Classic ASP VBScript编写? - BoffinBrain
1
被接受的答案使用了CBC模式下的AES(RijndaelManaged的默认Mode),但它没有执行消息认证码(MAC)验证,而在使用CBC模式下的AES时这是必要的。MAC可以防止对手在未被检测到的情况下更改IV或密文。我已经编写了自己的解决方案,在此执行带有MAC的AES加密:github.com/susam/aes.vbs。它适用于Base64编码的密钥,并负责MAC计算/验证。 - Susam Pal
1个回答

1
几天的调查后,我将发布最终结果。我知道这不是一个好的做法,但现在可以接受。
ASP代码(解密Java请求)
response.write desencriptar(encryptedStringHere)

Function desencriptar(str)
  set obj= CreateObject("System.Security.Cryptography.RijndaelManaged")
  set utf8 = CreateObject("System.Text.UTF8Encoding")
  ekey = "16byteskeyhere" 'you'll need to change this 
  eiv = "16bytesIVhere"   'you'll need to change this 
  obj.BlockSize = 128
  obj.Key = utf8.GetBytes_4(ekey)
  obj.IV = utf8.GetBytes_4(eiv)
  obj.Padding = 5
  set decryptor=obj.CreateDecryptor()
  desencriptado = Base64ToByte(str)
  byted=decryptor.TransformFinalBlock((desencriptado),0,lenb(desencriptado))
  desencriptado = utf8.getString((byted))
  desencriptar = desencriptado
end function

Function Base64ToByte(ByVal vCode)
  Dim oXML, oNode
  Set oXML = CreateObject("Msxml2.DOMDocument.3.0")
  Set oNode = oXML.CreateElement("base64")
  oNode.dataType = "bin.base64"
  oNode.text = vCode
  Base64ToByte = oNode.nodeTypedValue
  Set oNode = Nothing
  Set oXML = Nothing
End Function 

JAVA代码(加密函数)

public static String aesEncrypt(String value, String key, String initVector) {
    try {
        IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "Rijndael");
        Cipher cipher = Cipher.getInstance("Rijndael/CBC/PKCS5PADDING");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
        byte[] encrypted = cipher.doFinal(value.getBytes());
        return Base64.getEncoder().encodeToString(encrypted);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return null;
}

文档: RijndaelManaged | PaddingMode | CipherMode


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接