我正在通過XML流發佈到Web服務的項目。在這種情況下,提供者請求使用128位初始化向量以密碼塊鏈接(CBC)模式下的高級加密標準(AES)對路由xml進行加密。我在VB.Net中進行了編碼,並且根據我所知道的我已經滿足了他們的所有加密要求,但是當我提交該帖子時,我一直收到「無效的路由輸入加密」錯誤響應。我沒有做太多的加密工作,所以我希望有一些有加密經驗的人可以幫助我。它是否失敗,因爲我沒有正確的前綴IV?在AES中是否有標準的方法來將IV合併到密碼數據中?或者我自己在做加密本身有問題嗎?我在這裏呆了一段時間,嘗試了幾種不同的加密方式,但沒有成功。下面列出的是我的代碼和加密要求的摘要。.Net使用AES和128位加密XML流初始化向量
生成使用高級加密標準(AES)在密碼塊鏈接(CBC)具有128位初始化向量[AES]算法模式的對稱密鑰。不要使用零字節初始化向量。
使用AES對稱密鑰加密有效的路由輸入xml文檔。在128位初始化向量的前面加上密碼文本。 (不建議使用所有0字節的初始化向量。)
Base64編碼初始化向量和加密路由輸入xml文檔。
使用base64編碼的初始化向量和加密的Routing Input xml文檔構建ENCRYPTED_RI xml元素。
生成明文Routing Input xml文檔的SHA1哈希值。
連接明文路由輸入xml文檔和AES對稱密鑰的SHA1哈希。 (SHA1哈希+ AES對稱密鑰)
使用公鑰和RSA版本1.5算法[RFC 2437]加密連接結果。
Base64對加密級聯結果進行編碼。
使用base64編碼的加密級聯結果構建ENCRYPTED_KEY xml元素。
這裏是我的代碼:
Sub CreateEncryptionXML()
'############
'## CREATE AES KEY AND IV
'############
Dim SymKey() As Byte
Dim IV() As Byte
Dim aes As New AesCryptoServiceProvider
Using myAes As Aes = System.Security.Cryptography.Aes.Create()
myAes.KeySize = 128
myAes.BlockSize = 128
myAes.Mode = CipherMode.CBC
myAes.Key = Encoding.UTF8.GetBytes("MyEncryptionKey1")
myAes.IV = Encoding.UTF8.GetBytes("MyInitialVector1")
SymKey = myAes.Key
IV = myAes.IV
End Using
'############
'## ENCRYPT ROUTING INPUT XML DOC
'############
Dim riXml As New XmlDocument
riXml.Load("C:\routingdoc.xml")
aes.Key = SymKey
aes.IV = IV
aes.Mode = CipherMode.CBC
' Convert the plaintext string to a byte array.
Dim plaintextBytes() As Byte = System.Text.Encoding.UTF8.GetBytes(riXml.OuterXml.ToString())
' Create the stream.
Dim ms As New System.IO.MemoryStream
' Create the encoder to write to the stream.
Dim encStream As New CryptoStream(ms, aes.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write)
' Use the crypto stream to write the byte array to the stream.
encStream.Write(plaintextBytes, 0, plaintextBytes.Length)
encStream.FlushFinalBlock()
'############
'## PREFIX CIPHER TEXT WITH IV
'############
Dim encRiXml() As Byte = ms.ToArray
Dim arraySize As Integer = IV.Length + encRiXml.Length
Dim Merged(arraySize) As Byte
IV.CopyTo(Merged, 0)
encRiXml.CopyTo(Merged, IV.Length)
Dim Base64IVEncRiXML As String = Convert.ToBase64String(Merged)
'******** I BELIVE EVERYTHING PAST HERE IS CORRECT BUT INCLUDED IT TO SHOW WHOLE PROCESS **********
'############
'## CREATE SHA1 HASH FOR PLAINTEXT ROUTING INPUT
'############
Dim hash() As Byte = New SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(riXml.OuterXml.ToString()))
'############
'## CONCATENATE THE SHA1 HASH OF PLAINTEXT ROUTING INPUT XML WITH AES KEY
'############
Dim arraySize2 As Integer = hash.Length + SymKey.Length
Dim Merged2(arraySize2) As Byte
hash.CopyTo(Merged2, 0)
SymKey.CopyTo(Merged2, hash.Length)
'############
'## ENCRYPT CONCATENATED RESULT USING RSA
'############
Dim EncryptionKey As String = File.ReadAllText("C:\cert-1.txt").Replace("-----BEGIN CERTIFICATE-----" & vbCr & vbLf, "").Replace("-----END CERTIFICATE-----", "")
TextBox1.Text = EncryptionKey
Dim binaryCertData() As Byte = Convert.FromBase64String(EncryptionKey)
Dim cert As X509Certificate2 = New X509Certificate2(binaryCertData)
Dim xmlKey As String = cert.PublicKey.Key.ToXmlString(False)
Dim objRSA As RSACryptoServiceProvider = New RSACryptoServiceProvider()
objRSA.FromXmlString(xmlKey)
Dim encrypted() As Byte = objRSA.Encrypt(Merged2, False)
Dim RSAEncryptedSHA1HashAESKey As String = Convert.ToBase64String(encrypted)
postStaticTest(RSAEncryptedSHA1HashAESKey, Base64IVEncRiXML)
End Sub
'PROVIDED SAMPLE OF XML OUTPUT FROM DOCUMENTATION
'<?xml version="1.0" encoding="UTF-8"?>
'<SECURE_REQUEST_GROUP>
'<ENCRYPTED_KEY Algorithm=」http://www.w3.org/2001/04/xmlenc#rsa-1_5」 >
'bXcCaS97p8TtGzlgZ9ogRcEAaw1D1OQCpk1AQFfWYE5J2CheNtRBpuME+uB3wSkwjIWftkYxQ5JRTQ3Qhz7LrCM+TOORl2lFFTpVC9zGUP1xndfT6EQONViV0XGJieWCzXNyjO3XpEl7IdntkVKucrDN9gA7wlimUdw4Ya5sn08=
'</ ENCRYPTED_KEY>
'< ENCRYPTED_RI Algorithm=」http://www.w3.org/2001/04/xmlenc#aes128-cbc」>
'9BWPkFDt0Ua/2gN9+BDT9XbYHBuadEREIV1EUmvon/jSr0HkndD/9lBo95H3UYD12TL3wmXVSqi7Ak/QqxzmVRDMgw2Wy0Ezdc3eaA9tOE1c49ZcaZpGM23R1BOazTGdky5v2+oBvSj4a+Ry/aJynvzKvxpTYd15IKOOzPsF/n89Oj6XdjA1TTdn2FCEwo6IkPi0D5QK2i1i/pilEyrrSYQ0oWkYc6ON/OQyL/oHlkBXk0zzQd1HBPOde4/3C6ceajUTvqiIlP6dRBHe6DZ3Ps34g7326jg3koh59RYao/0StgpF3wTJaZ/W36nqlpT3aeoLa/5oKh4A7DjHbYCHTw1uYkPXVGLFl6zTpFRw8hGkPfBRZmS5lXnQl6xidqftb+fx61yBj80/FHAlvmUzBsSQZggeXzBjqlVoWudCuGdC5QH1xKBWrm8haS2UIEdK/DH8fC13oFMpS++C7HTc/u9N8iH6qF0GimxYHvhKwdk3iw/hxrw5Bv1/tQjI1snJm9U1HnokDwG5BWZJp8jBuPgJIapc/DQgIEbM+3NMJXoB/ed9PquPFPPlfoo4E13a3PZPYIDImnLkOjvdPMrZ8A==
'</ ENCRYPTED_RI>
'</SECURE_REQUEST_GROUP>
找出他們是否正在使用具有128,192或256位密鑰的AES(這些是AES的FIPS兼容標準密鑰大小)。指定了128位IV,但這是標準的,所有AES都使用IV尺寸,因爲所有類型的AES使用128位塊。其餘的要求看起來非常簡單。 – Kevin