2009-09-25 109 views
1

我想使用TripleDES在我的ASP.NET应用程序和另一个开发人员的CF应用程序之间交换加密的数据。TripleDES加密 - .NET和ColdFusion打得不好

这是他的CF代码(虚拟键当然IV):

<cfset variables.theKey = "rpaSPvIvVLlrcmtzPU9/c67Gkj7yL1S5"> 
<cfset variables.theIV = BinaryDecode("password","Base64")> 
<cfset variables.theAlgorithm = "DESEDE"> 
<cfset variables.theEncoding = "Base64"> 

<cfif IsDefined("form.string") and IsDefined("form.method")> 
    <cfif form.method is "encrypt"> 
     <cfset variables.theString = encrypt(form.string, variables.theKey, variables.theAlgorithm, variables.theEncoding, variables.theIV)> 
    </cfif> 
    <cfif form.method is "decrypt"> 
     <cfset variables.theString = decrypt(form.string, variables.theKey, variables.theAlgorithm, variables.theEncoding, variables.theIV)> 
    </cfif> 
    <cfoutput><p>Output: #variables.theString#</cfoutput> 
</cfif> 

这里是我的VB.NET(我省略了异常处理等):

Private IV() As Byte = ASCIIEncoding.ASCII.GetBytes("password") 
    Private EncryptionKey() As Byte = Convert.FromBase64String("rpaSPvIvVLlrcmtzPU9/c67Gkj7yL1S5") 

    Public Function EncryptString(ByVal Input As String) As String 
     Dim buffer() As Byte = Encoding.UTF8.GetBytes(Input) 
     Dim des As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider 
     des.Key = EncryptionKey 
     des.IV = IV 
     Return Convert.ToBase64String(des.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length())) 
    End Function 

    Public Function DecryptString(ByVal Input As String) As String 
     Dim buffer() As Byte = Convert.FromBase64String(Input) 
     Dim des As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider 
     des.Key = EncryptionKey 
     des.IV = IV 
     Return Encoding.UTF8.GetString(des.CreateDecryptor().TransformFinalBlock(buffer, 0, buffer.Length())) 
    End Function 

我们会得到不同的结果。

想到的最明显的一点是,他使用的Base64创建从密码IV,而我使用的ASCII - 但如果我这样做

Private IV() As Byte = Convert.FromBase64String("password") 

那么.NET并不开心,因为它为IV获得一个6字节的数组,并且它需要8个字节。

任何想法我们做错了 - 最好改变我可以使我的(VB.NET)代码,使这项工作?或者失败了,在两种环境之间可以更好地工作的另一种方法?

+0

@赫伯 - 只是一个猜测,但也许他们的第四被忽略。无论是否有IV,我都会得到相同的结果。该文件说“[IV] ..该算法必须包含除ECB以外的反馈模式。”这似乎表明,除非您提供不同的反馈模式,否则不会使用IV。 – Leigh 2009-09-25 18:41:41

+0

我曾经和客户有过同样的问题(我在CF上,他在.NET上)。我们最终放弃了并使用了AES,并为我们工作。 – ryber 2009-10-02 12:48:21

回答

0

尝试使用UTF8编码进行密码验证。

Private IV() As Byte = Encoding.UTF8.GetBytes("password") 
+0

没有骰子。无论如何,密码都是ASCII,所以Encoding.UTF8.GetBytes产生与Encoding.Ascii.GetBytes相同的结果。 – 2009-09-25 13:32:40

+0

当你在没有IV的情况下从VB.NET尝试它时会发生什么? – Leigh 2009-09-25 22:16:52

1

默认为CF似乎是 “DESede/ECB/PKCS5Padding”,但在VB.NET他们是 “DESede/CBC/PKCS7”。我不知道为什么,但是两个填充(PKCS5和PKCS7)似乎是兼容的。

为了得到它的工作,您可能需要改变模式到VB.NET侧“ECB”

Public Function EncryptString(ByVal Input As String) As String 
     Dim buffer() As Byte = Encoding.UTF8.GetBytes(Input) 
     Dim des As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider 
     des.Mode = CipherMode.ECB 
     des.Key = EncryptionKey 
     des.IV = IV 
     Return Convert.ToBase64String(des.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length())) 
End Function 

.. 变化的CF模式和IV相匹配的VB.NET默认

<cfset variables.theKey = "rpaSPvIvVLlrcmtzPU9/c67Gkj7yL1S5" /> 
    <cfset variables.theIV = javacast("string", "password").getBytes() /> 
    <cfset variables.theAlgorithm = "DESede/CBC/PKCS5Padding"> 
    <cfset variables.theEncoding = "Base64"> 
+0

谢谢,我会试一试。 – 2009-12-01 13:48:54