2013-04-30 78 views
0

我有一个VB.NET应用程序,我试图将加密信息发送到Progress 4GL 10.2B应用程序。我已经匹配了迭代计数,盐,私钥和初始化向量。我无法理解为什么我们要生成不同的密钥。我在.NET中使用silverlight,而rfc2898derivebytes类使用HMACSHA-1哈希算法,因为进度使用SHA-1哈希算法。我试图看看如何映射两个系统来传输简单的字符串。.NET进度4GL密码

下面是VB.NET代码

enter codePublic Class OASISCryptography 

Const _privateKey As String = "MEXMUELLER" 

Public Shared Function GetSalt() As Byte() 
    Dim salt() As Byte = New Byte(7) {} 
    Dim s As New RNGCryptoServiceProvider 
    s.GetBytes(salt) 
    Return salt 
End Function 

Public Shared Function EncryptValue(ByVal data As String, ByVal salt() As Byte) As Byte() 
    Using myAes As New AesManaged() 
     Dim salt2() As Byte = System.Text.Encoding.UTF8.GetBytes("JosephsT") 
     Dim Key As System.Security.Cryptography.Rfc2898DeriveBytes = New Rfc2898DeriveBytes(_privateKey, salt, 2000) 
     myAes.Key = Key.GetBytes(128/8) 
     myAes.IV = System.Text.Encoding.UTF8.GetBytes("HR$2pIjHR$2pIj12") 
     Dim encrypted As Byte() = EncryptStringFunction(data, myAes.Key, myAes.IV) 
     Return encrypted 
    End Using 
End Function 

Public Shared Function DecryptValue(ByVal data() As Byte, ByVal salt() As Byte) As String 
    Using myAes As New AesManaged() 
     Dim salt2() As Byte = System.Text.Encoding.UTF8.GetBytes("JosephsT") 
     Dim Key As System.Security.Cryptography.Rfc2898DeriveBytes = New Rfc2898DeriveBytes(_privateKey, salt2, 2000) 
     myAes.Key = Key.GetBytes(128/8) 
     Dim genKey As String = Nothing 
     For Each g In myAes.Key 
      genKey = genKey & g 
     Next 
     myAes.IV = System.Text.Encoding.UTF8.GetBytes("HR$2pIjHR$2pIj12") 
     Dim decrypted As String = DecryptStringFunction(data, myAes.Key, myAes.IV) 
     Return decrypted 
    End Using 
End Function 

Public Shared Function EncryptStringFunction(ByVal data As String, ByVal Key() As Byte, ByVal IV() As Byte) As Byte() 
    'check arguments 
    If data Is Nothing OrElse data.Length <= 0 Then 
     Throw New ArgumentNullException("data") 
    End If 
    If Key Is Nothing Or Key.Length <= 0 Then 
     Throw New ArgumentNullException("Key") 
    End If 
    If IV Is Nothing Or IV.Length <= 0 Then 
     Throw New ArgumentNullException("IV") 
    End If 
    Dim encrypted() As Byte 
    Using aesALG As New AesManaged() 
     aesALG.Key = Key 
     aesALG.IV = IV 
     ' Create a encryptor to perform the stream transform. 
     Dim encryptor As ICryptoTransform = aesALG.CreateEncryptor(aesALG.Key, aesALG.IV) 
     ' Create the streams used for encryption. 
     Using msEncrypt As New MemoryStream 
      Using csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write) 
       Using swEncrypt As New StreamWriter(csEncrypt) 
        'Write all data to the stream. 
        swEncrypt.Write(data) 
       End Using 
      End Using 
      encrypted = msEncrypt.ToArray 
     End Using 
    End Using 
    Return encrypted 
End Function 

Public Shared Function DecryptStringFunction(ByVal encrytedData() As Byte, ByVal Key() As Byte, ByVal IV() As Byte) As String 
    If encrytedData Is Nothing Or encrytedData.Length <= 0 Then 
     Throw New ArgumentNullException("EncryptedData") 
    End If 
    If Key Is Nothing Or Key.Length <= 0 Then 
     Throw New ArgumentNullException("Key") 
    End If 
    If IV Is Nothing Or IV.Length <= 0 Then 
     Throw New ArgumentNullException("IV") 
    End If 
    Dim plainText As String = Nothing 
    Using aesALG As New AesManaged() 
     aesALG.Key = Key 
     aesALG.IV = IV 
     Dim decryptor As ICryptoTransform = aesALG.CreateDecryptor(aesALG.Key, aesALG.IV) 
     Using msDecrypt As New MemoryStream(encrytedData) 
      Using csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read) 
       Using srDecrypt As New StreamReader(csDecrypt, True)      
        plainText = srDecrypt.ReadToEnd 
       End Using 
      End Using 
     End Using 
    End Using 
    Return plainText 
End Function 
End Class 

这里是正在执行

SECURITY-POLICY:SYMMETRIC-ENCRYPTION-ALGORITHM = "AES_CBC_128". 
SECURITY-POLICY:PBE-KEY-ROUNDS = 2000. 
SECURITY-POLICY:PBE-HASH-ALGORITHM = "SHA-1". 
/*SECURITY-POLICY:SYMMETRIC-ENCRYPTION-IV = ? /*mymemptr*/ /*IV*/. */ 

/* first, decrypt username */ 
SECURITY-POLICY:ENCRYPTION-SALT = ip-value3. 
SECURITY-POLICY:SYMMETRIC-ENCRYPTION-KEY = GENERATE-PBE-KEY (password,ip-value3). 
qadusername = get-string(DECRYPT (ip-value1),1). 
qadpasswd = get-string(DECRYPT (ip-value2),1). 
output to /tmp/decrypt.tst append. 
put unformatted qadusername "-" qadpasswd skip . 
output close. 

qadusername = replace(qadusername,"SPD/",""). 
for first usr_mstr no-lock where 
usr_mstr.usr_active and 
usr_userid = qadusername and 
usr_passwd = encode(qadpasswd) : 
op-value1= true. 
END. 

/* second, encrypt a value and send back*/ 
/* 
SECURITY-POLICY:ENCRYPTION-SALT = GENERATE-PBE-SALT.*/ 
salt-value = SECURITY-POLICY:ENCRYPTION-SALT. 
/* 
SECURITY-POLICY:SYMMETRIC-ENCRYPTION-KEY = GENERATE-PBE-KEY (password,ip-value3). 
*/ 
op-value2 = ENCRYPT ("joe wears a tootoo and a dress!"). 
op-value3 = salt-value. 
op-value4 = IV. 
op-value5 = GENERATE-PBE-KEY (password). 

回答

0

我知道我回答我的问题,但如果任何人有一个更好的办法做到这让我知道......对于任何想要完成此任务的人,您都需要这些代码。我目前静脉注射静脉注射,但通常不会这样做。您将生成动态,并通过它

Public Shared Function EncryptValue(ByVal data As String, ByVal salt() As Byte) As Byte() 
    Using myAes As New AesManaged 
     Dim key2 As PasswordDeriveBytes = New PasswordDeriveBytes(_privateKey, salt) 
     key2.IterationCount = 2000 
     key2.HashName = "SHA1" 
     myAes.Padding = PaddingMode.PKCS7 
     myAes.Mode = CipherMode.CBC 
     myAes.KeySize = myAes.LegalKeySizes(0).MinSize 
     myAes.BlockSize = myAes.LegalBlockSizes(0).MinSize 
     myAes.IV = System.Text.Encoding.UTF8.GetBytes("HR$2pIjHR$2pIj12") 
     myAes.Key = key2.GetBytes(16) 
     Dim encrypted As Byte() = EncryptStringFunction(data, myAes.Key, myAes.IV) 
     Return encrypted 
    End Using 
End Function 

Public Shared Function DecryptValue(ByVal data() As Byte, ByVal salt() As Byte) As String 
    Using myAes As New AesManaged 
     Dim key2 As PasswordDeriveBytes = New PasswordDeriveBytes(_privateKey, salt) 
     key2.IterationCount = 2000 
     key2.HashName = "SHA1"    
     myAes.Padding = PaddingMode.PKCS7 
     myAes.Mode = CipherMode.CBC 
     myAes.KeySize = myAes.LegalKeySizes(0).MinSize 
     myAes.BlockSize = myAes.LegalBlockSizes(0).MinSize 
     myAes.IV = System.Text.Encoding.UTF8.GetBytes("HR$2pIjHR$2pIj12") 
     myAes.Key = key2.GetBytes(16) 
     Dim decrypted As String = DecryptStringFunction(data, myAes.Key, myAes.IV) 
     Return decrypted 
    End Using 
End Function 
+0

谁能告诉我如何在没有过时的类,请...我想,如果你知道如何做到这一点,我可以与RFC2898DeriveBytes类执行此执行此操作将极大地帮助。 – 2013-05-01 19:39:16