1

TripleDES を使用して、自分の ASP.NET アプリケーションと別の開発者の CF アプリとの間で暗号化されたデータを交換しようとしています。

これが彼の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)コードに変更を加えることができますか?それとも、2 つの環境間でより適切に機能する別のアプローチで失敗しますか?

4

2 に答える 2

1

CF のデフォルトは " DESede/ECB/PKCS5Padding " のようですが、VB.NET では " DESede/CBC/PKCS7 " です。理由はわかりませんが、2 つのパディング (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">
于 2009-12-01T11:08:54.893 に答える
0

パスワードに UTF8 エンコーディングを使用してみてください。

Private IV() As Byte = Encoding.UTF8.GetBytes("password")
于 2009-09-25T09:07:02.257 に答える