用RC2CryptoServiceProvider来加密解密字符串

本文介绍了如何使用Microsoft的RC2CryptoServiceProvider类进行字符串的加解密操作,区分了ANSI和Unicode模式,并提供了示例代码实现加密和解密过程。
摘要由CSDN通过智能技术生成

参考微软 RC2CryptoServiceProvider构造函数中示例,写了个加密解密函数,可以用来进行一般字符串的加解密用。


#Region " rc2Encode 、rc2Decode 加解密 "
    'ANSIMode = False '可对任何Unicode字符串加解密
    'ANSIMode = True  '只对 ANSI 字符串加解密,对英文字符串的加密串长度较短,中文和False时一样
    '因为经GetBytes转换时,英文经“系统的当前 ANSI 代码页的编码”编码只有1byte,中文为2byte,
    '而经Unicode编码不管英文中文都是2byte。

    '将随机生成的key与IV写死在程序中,即可实现加密与解密
    Dim key As Byte() = {7, 66, 154, 167, 94, 148, 230, 29, 135, 47, 51, 75, 44, 196, 52, 54}        '16位
    Dim IV As Byte() = {144, 26, 212, 228, 206, 111, 24, 244}                                        '8位

    Public Function rc2Encode(ByVal InStr1 As String, Optional ByVal ANSIMode As Boolean = True) As String
        Dim rc2CSP As New RC2CryptoServiceProvider()

        ' Get the key and IV.
        'Dim key As Byte() = Encoding.ASCII.GetBytes("1234567890123456")
        'Dim IV As Byte() = Encoding.ASCII.GetBytes("12345678")

        ' Get an encryptor.
        Dim encryptor As ICryptoTransform = rc2CSP.CreateEncryptor(key, IV)

        ' Encrypt the data as an array of encrypted bytes in memory.
        Dim msEncrypt As New MemoryStream()
        Dim csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)

        ' Convert the data to a byte array.
        Dim toEncrypt As Byte()

        If ANSIMode Then
            toEncrypt = Encoding.ASCII.GetBytes(InStr1)
        Else
            toEncrypt = Encoding.Unicode.GetBytes(InStr1)
        End If

        ' Write all data to the crypto stream and flush it.
        csEncrypt.Write(toEncrypt, 0, toEncrypt.Length)
        csEncrypt.FlushFinalBlock()

        ' Get the encrypted array of bytes.
        Dim encrypted As Byte() = msEncrypt.ToArray()
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' This is where the data could be transmitted or saved.          
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''
        '将加密的结果以16进制字符保存
        Dim tmpstr As New StringBuilder()
        For i As Int32 = 0 To encrypted.Length - 1
            tmpstr.Append(Microsoft.VisualBasic.Right("0" + Hex(encrypted(i)), 2))
        Next
        rc2Encode = tmpstr.ToString

    End Function
    Public Function rc2Decode(ByVal InStr1 As String, Optional ByVal ANSIMode As Boolean = True) As String
        Try

            'InStr1传入空值或非加密后的字符串,将引发错误。2019.8.16
            Dim rc2CSP As New RC2CryptoServiceProvider()

            ' Get the key and IV.
        'Dim key As Byte() = Encoding.ASCII.GetBytes("1234567890123456")
        'Dim IV As Byte() = Encoding.ASCII.GetBytes("12345678")

            Dim decryptor As ICryptoTransform = rc2CSP.CreateDecryptor(key, IV)

            '将原来以16进制字符保存的加密结果,转换为byte数组,以便解码
            Dim encrypted(InStr1.Length / 2 - 1) As Byte
            For k As Int32 = 0 To InStr1.Length / 2 - 1
                encrypted(k) = CByte(Convert.ToInt16(Mid(InStr1, k * 2 + 1, 2), 16))
            Next

            ' Now decrypt the previously encrypted message using the decryptor
            ' obtained in the above step.
            Dim msDecrypt As New MemoryStream(encrypted)
            Dim csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)

            Dim fromEncrypt() As Byte
            fromEncrypt = New Byte(encrypted.Length) {}

            'Read the data out of the crypto stream.
            csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length)
            Dim RealLength As Integer

            For RealLength = fromEncrypt.Length - 1 To 0 Step -1     '解密后数据为8位的倍数,后面为0的数据为无效数据 2024.1.5
                If fromEncrypt(RealLength) <> 0 Then
                    RealLength += 1
                    Exit For
                End If
            Next

            'Convert the byte array back into a string.
            Dim outstr As String
            If ANSIMode Then
                Dim newArray(RealLength - 1) As Byte
                Array.Copy(fromEncrypt, newArray, RealLength)
                outstr = Encoding.ASCII.GetString(newArray)
            Else
                If RealLength Mod 2 = 1 Then
                    RealLength += 1
                End If
                Dim newArray(RealLength - 1) As Byte
                Array.Copy(fromEncrypt, newArray, RealLength)

                outstr = Encoding.Unicode.GetString(newArray)
            End If

            rc2Decode = outstr

        Catch ex As Exception
            rc2Decode = "Error input data"
        End Try
    End Function
#End Region

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值