【问题标题】:.NET to Progress 4GL Cryptography.NET 推进 4GL 密码学
【发布时间】:2013-04-30 13:36:25
【问题描述】:

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

下面是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).

【问题讨论】:

    标签: .net cryptography aes sha1


    【解决方案1】:

    我知道我正在回答我自己的问题,但如果有人有更好的方法来做到这一点,请告诉我......对于任何试图完成此任务的人,您都需要此代码。我目前有 IV 静态,但为了很好的衡量,你通常不会这样做。您将动态生成并传递它

     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
    

    【讨论】:

    • 谁能告诉我如何在一个过时的类中执行此操作...如果您知道如何执行此操作,我希望我可以使用 RFC2898DeriveBytes 类执行此操作,这将有很大帮助。跨度>
    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多