Capicom VS .Net System.Security.Cryptography中的3DES标准不同?

时间:2011-06-13 11:28:11

标签: cryptography encryption 3des

我正在使用标准的3DES 128bit加密和解密字符串。它在两个不同的环境中实施;经典ASP(VB6)和.Net。

我认为3DES是标准的,但是,我不能使它们兼容这两者(capicom和.Net)。一旦谷歌搜索,我意识到capicom有一些自己的定制魔术。

据我所知,3DES要求两个指定128位(8字节)的密钥(密码), 8字节的“IV”。所以,我找不到任何可以在capicom中指定“IV”的8个字节的地方,因此,我怀疑这会导致差异。


.Net System.Security.Cryptography

Dim m_des As New TripleDESCryptoServiceProvider

...

Private ReadOnly str_key As String = "MyPwd1234567890p"
Private ReadOnly iv() As Byte = {8, 7, 6, 5, 4, 3, 2, 1}
Private m_utf8 As New UTF8Encoding
Private m_key() As Byte
Private m_iv() As Byte

Public Sub New(ByVal key() As Byte, ByVal iv() As Byte)
        Me.m_key = key
        Me.m_iv = iv
End Sub

' VB.NET to convert a string to a byte array
Public Shared Function StrToByteArray(ByVal str As String) As Byte()
  Dim encoding As New System.Text.UTF8Encoding()
  Return encoding.GetBytes(str)
End Function

Public Function Encrypt(ByVal input() As Byte) As Byte()        
        Return Transform(input, m_des.CreateEncryptor(StrToByteArray(str_key), m_iv))
End Function

VB6环境中的Capicom:

Dim DecryptData
Set DecryptData = CreateObject("CAPICOM.EncryptedData")

Dim sDAta
sData = "Hello World"

DecryptData.Algorithm.KeyLength = CAPICOM_ENCRYPTION_KEY_LENGTH_128_BITS
DecryptData.Algorithm.Name = CAPICOM_ENCRYPTION_ALGORITHM_3DES
DecryptData.SetSecret("MyPwd1234567890p")

result = DecryptData.Decrypt(sData)

希望您可以提供一些想法。

1 个答案:

答案 0 :(得分:1)

如果VB6不需要初始化向量,可能是因为它使用的是Electronic Cookbook模式(ECB)而不是.Net版本正在使用的Cipher Block Chaining模式(CBC)。如果将.Net版本切换为ECB,您可能可以加密和解密跨平台。但是,CBC是更安全的加密模式,因此可能值得尝试弄清楚如何强制CAPICOM使用CBC并指定初始化向量。

此外,您不应该对初始化向量(或键,但我假设您正在进行测试)进行硬编码,每次生成新密钥时都应该生成一个。