我正在尝试在 VB6 中使用 AES 加密数据,并在 Java 中匹配相同的加密。我在这里从 Microsoft 获取了基本的 VB6 代码:http: //support.microsoft.com/kb/821762
VB6:
strProvider = "Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)" & vbNullChar
lngHashType = CALG_MD5
lngAlgoType = CALG_AES_128
strPassword = "secretPassphrase"
If CBool(CryptAcquireContext(g_lngCryptoContext, ByVal strTemp, _
ByVal strProvider, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) Then
GetProvider = True
else
GoTo CleanUp
End If
If Not CBool(CryptCreateHash(g_lngCryptoContext, lngHashType, ByVal 0&, _
ByVal 0&, lngHashHnd)) Then
MsgBox "Error: " & CStr(GetLastError) & " during CryptCreateHash!", _
vbExclamation Or vbOKOnly, "Encryption Errors"
GoTo CleanUp
End If
If Not CBool(CryptHashData(lngHashHnd, strPassword, Len(strPassword), ByVal 0&)) Then
MsgBox "Error: " & CStr(GetLastError) & " during CryptHashData!", _
vbExclamation Or vbOKOnly, "Encryption Errors"
GoTo CleanUp
End If
If Not CBool(CryptDeriveKey(g_lngCryptoContext, lngAlgoType, _
lngHashHnd, ByVal CRYPT_NO_SALT, lngkey)) Then
MsgBox "Error: " & CStr(GetLastError) & " during CryptDeriveKey!", _
vbExclamation Or vbOKOnly, "Encryption Errors"
GoTo CleanUp
End If
If lngHashHnd <> 0 Then
lngRetCode = CryptDestroyHash(lngHashHnd)
End If
lngHashHnd = 0
lngEncDataLength = Len(g_strInData)
lngEnctBuffLen = lngEncDataLength * 2
strEncBuffer = String$(lngEnctBuffLen, vbNullChar)
LSet strEncBuffer = g_strInData
If Not CBool(CryptEncrypt(lngkey, ByVal 0&, ByVal 1&, ByVal 0&, _
strEncBuffer, lngEncDataLength, lngEnctBuffLen)) Then
MsgBox "Bytes required:" & CStr(lngEnctBuffLen) & vbCrLf & vbCrLf & _
"Error: " & CStr(GetLastError) & " during CryptEncrypt!", _
vbExclamation Or vbOKOnly, "Encryption Errors"
GoTo CleanUp
End If
strOutData = Mid$(strEncBuffer, 1, lngEncDataLength)
g_abytOutData = StringToByteArray(strOutData)
模式、填充、iv 和块长度没有明确设置,而是 CBC、PKCS5、{0、0、0、0、0、0、0、0、0、0、0、0、0、0、0 , 0} 和 128 分别是默认值,我已经使用 GetKeyParam 函数进行了验证。
爪哇:
String password = "secretPassphrase";
String text = "text to encrypt";
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(password.getBytes("UTF-8"), 0, password.length());
byte[] rawKey = md.digest();
byte[] iv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
IvParameterSpec ivSpec = new IvParameterSpec(iv);
SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "SunJCE");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivSpec);
byte[] encrypted = cipher.doFinal(text.getBytes("UTF-8"));
System.out.println(toHex(encrypted));
即使我在两边都设置了相同的加密设置,但当我将加密输出为十六进制时,我会得到不同的结果。我想知道这 2 个不同的 CSP 是否使用 AES 兼容?
如果我在两端稍微更改代码以使用 RC2 而不是 AES,则加密匹配。
任何想法将不胜感激。我正在把头发拉出来。