2

我正在尝试在 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,则加密匹配。

任何想法将不胜感激。我正在把头发拉出来。

4

0 回答 0