none
求DES加密、解密算法 RRS feed

  • 问题

  • 大家好  那位能给我一段DES算法的加密解密代码  (vb.net)   

    我写了一个 用不了 总是提示“不正确数据”   ,后来发现是没有定义密钥,怎样定义密钥呢 有什么规则吗  


    昨夜西风凋碧树,独上高楼,望尽天涯路!
    2010年6月4日 8:15

答案

  • 你好!

         具体可以参考:

    http://www.wesoho.com/article/net/2182.htm

         希望对你有帮助!


    周雪峰
    • 已标记为答案 litianlt 2010年6月7日 7:02
    2010年6月4日 12:13
    版主

全部回复

  • 大家好  那位能给我一段DES算法的加密解密代码  (vb.net)   

    我写了一个 用不了 总是提示“不正确数据”   ,后来发现是没有定义密钥,怎样定义密钥呢 有什么规则吗  


    昨夜西风凋碧树,独上高楼,望尽天涯路!
    2010年6月4日 8:17
  • 你好!

         具体可以参考:

    http://www.wesoho.com/article/net/2182.htm

         希望对你有帮助!


    周雪峰
    • 已标记为答案 litianlt 2010年6月7日 7:02
    2010年6月4日 12:13
    版主
  • 你好  谢谢

    为什么我用这段代码  加密出来的字符串是乱码呢 

     Try
                'Dim inData As Byte() = Encoding.Unicode.GetBytes(sourceString)
                Dim inputByteArray As Byte() = Encoding.Default.GetBytes(sourceString)
            
                Dim btKey As Byte() = ASCIIEncoding.ASCII.GetBytes(key)
                Dim btIV As Byte() = ASCIIEncoding.ASCII.GetBytes(iv)
                Dim des As New DESCryptoServiceProvider()
                Dim ms As New MemoryStream()

                Dim cs As New CryptoStream(ms, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write)

                cs.Write(inputByteArray, 0, inputByteArray.Length)
                cs.FlushFinalBlock()
                ms.Dispose()
                Return Encoding.Default.GetString(ms.ToArray())
            Catch ex As Exception

            End Try

     解密时  Convert.FromBase64String(sourcestring)  提示错误   “Base-64 字符串中的无效字符”

    这是什么问题呢  谢谢 

     

    如果改成下面这样  没有错误提示 但会出现解密的结果和加密的字符串不一样 

     Try
                Dim inputByteArray As Byte() = Encoding.Unicode.GetBytes(SourceString)
                'Dim inputByteArray As Byte() = Encoding.Default.GetBytes(sourceString)

                Dim btKey As Byte() = ASCIIEncoding.ASCII.GetBytes(key)
                Dim btIV As Byte() = ASCIIEncoding.ASCII.GetBytes(iv)
                Dim des As New DESCryptoServiceProvider()
                Dim ms As New MemoryStream()

                Dim cs As New CryptoStream(ms, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write)

                cs.Write(inputByteArray, 0, inputByteArray.Length)
                cs.FlushFinalBlock()
                ms.Dispose()
                Return Encoding.Default.GetString(ms.ToArray())
            Catch ex As Exception

            End Try 

    这又是为什么呢  谢谢


    昨夜西风凋碧树,独上高楼,望尽天涯路!
    2010年6月7日 2:32
  • 你好!

      这两行你换成UTF8 ,不要使用ASCII:

                Dim btKey As Byte() = ASCIIEncoding.ASCII.GetBytes(key)
                Dim btIV As Byte() = ASCIIEncoding.ASCII.GetBytes(iv)


    周雪峰
    2010年6月7日 3:29
    版主
  • 你好  用你说的方法还是不行的 

    加密过程

    Public Sub Encrypt()
            Try
                Dim inputByteArray As Byte() = Encoding.Unicode.GetBytes(SourceString)

                'Dim btKey As Byte() = ASCIIEncoding.ASCII.GetBytes(key)
                'Dim btIV As Byte() = ASCIIEncoding.ASCII.GetBytes(iv)
                Dim btKey As Byte() = Encoding.UTF8.GetBytes(key)
                Dim btIV As Byte() = Encoding.UTF8.GetBytes(iv)
                Dim des As New DESCryptoServiceProvider()
                Dim ms As New MemoryStream()

                Dim cs As New CryptoStream(ms, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write)

                cs.Write(inputByteArray, 0, inputByteArray.Length)
                cs.FlushFinalBlock()
                ms.Dispose()
                EncryptedString = Convert.ToBase64String(ms.ToArray)
                'EncryptedString = Encoding.Default.GetString(ms.ToArray())
            Catch ex As Exception

            End Try

    在加密过程中如果用 EncryptedString = Encoding.Default.GetString(ms.ToArray()) 加密后的字符串就会出现乱码   解密时提示错误   “Base-64 字符串中的无效字符”

    如果在加密过程中使用  EncryptedString = Convert.ToBase64String(ms.ToArray) 则加密没有问题   但用下面的方法解密时,解密后所得的字符串只有原字符串的第一个字符    结果不对

    解密过程

     Public Sub Decrypt()
            'Dim btKey As Byte() = ASCIIEncoding.ASCII.GetBytes(key)
            'Dim btIV As Byte() = ASCIIEncoding.ASCII.GetBytes(iv)
            Dim btIV As Byte() = Encoding.UTF8.GetBytes(iv)
            Dim btKey As Byte() = Encoding.UTF8.GetBytes(key)

            Dim des As New DESCryptoServiceProvider()

            Dim ms As New MemoryStream()

            Try
                Dim inputByteArray As Byte() = Convert.FromBase64String(EncryptedString)

                Dim cs As New CryptoStream(ms, DES.CreateDecryptor(btKey, btIV), CryptoStreamMode.Write)
                cs.Write(inputByteArray, 0, inputByteArray.Length)
                cs.FlushFinalBlock()
                cs.Dispose()
                EncryptToStr = Encoding.Default.GetString(ms.ToArray())
                ms.Dispose()
            Catch ex As Exception

            End Try
        End Sub

    请问这是怎么回事呢   谢谢

     


    昨夜西风凋碧树,独上高楼,望尽天涯路!
    2010年6月7日 3:46
  • 你好 我找到原因了,是因为加密字符串转换为数组的编码格式要和解密时数组转换为字符串的编码格式相同  

    谢谢你


    昨夜西风凋碧树,独上高楼,望尽天涯路!
    2010年6月7日 7:02