2009-09-25 4 views
1

TripleDES를 사용하여 ASP.NET 응용 프로그램과 다른 개발자의 CF 응용 프로그램간에 암호화 된 데이터를 교환하려고합니다.TripleDES 암호화 - .NET 및 ColdFusion이 좋지 않음

는 여기에 자신의 CF 코드 (가상 키 물론 IV)의 :

가 여기 내 VB.NET의
<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> 

(I 예외 처리 등을 남겨 두었다) :

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 

을 우리 다른 결과를 얻고 있습니다. 마음에 오는

분명한 것은 내가 ASCII를 사용하고있는 반면 그가 암호에서 IV를 만들 Base64로를 사용하고 있다는 것입니다 -하지만이

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

할 경우 다음 .NET 때문에 행복하지 않다 그것은 IV를위한 6 바이트 배열을 얻고 있고 그것은 8 바이트를 원합니다.

우리가 잘못하고있는 아이디어가 있습니다.이 작업을 수행하기 위해 내 (VB.NET) 코드를 변경하는 것이 좋습니다. 아니면 두 가지 환경간에 더 잘 작동하는 다른 접근 방식을 사용하지 않습니까?

+0

@Herb - 그냥 추측하지만 어쩌면 그들의 IV가 무시되고 있습니다. 나는 IV가 있거나없는 CF에서 같은 결과를 얻는다. 설명서에 "[IV] .. 알고리즘에 ECB가 아닌 피드백 모드가 있어야합니다." 그것은 IV가 다른 피드백 모드를 제공하지 않으면 사용되지 않는다고 제안하는 것 같습니다. – Leigh

+0

나는 한 번 클라이언트에서 동일한 문제를 겪었습니다 (CF에 있었고 .NET에있었습니다). 우리는 결국 결국 AES를 포기하고 사용했고 그것은 우리를 위해 일했습니다. – ryber

답변

0

암호로 UTF8 인코딩을 사용해보십시오.

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

주사위가 없습니다. 암호는 모두 ASCII이므로 Encoding.UTF8.GetBytes는 Encoding.Ascii.GetBytes와 동일한 결과를 생성합니다. –

+0

IV없이 VB.NET에서 시도하면 어떻게됩니까? – Leigh

1

CF의 기본값은 "DESede/ECB/PKCS5Padding에"것 같다하지만, VB.NET에서 그들은 "DESede/CBC/PKCS7"입니다. 이유는 모르지만 두 패딩 (PKCS5 및 PKCS7)이 호환되는 것 같습니다.

하면 하나가

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에 맞게 VB.NET 측 "ECB"로 모드를 변경해야, 그것은 일을 얻으려면 기본값

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

고마워, 나는 이것을 시험해 보겠다. –

관련 문제