157 lines
6.3 KiB
VB.net
157 lines
6.3 KiB
VB.net
|
|
Imports System.IO
|
|||
|
|
Imports System.Security.Cryptography
|
|||
|
|
Imports System.Text
|
|||
|
|
|
|||
|
|
Public Class StringEncryption
|
|||
|
|
|
|||
|
|
Public Shared KeyBase64 As String = "JVr/l75Wv29+d643g7+h89Q2Z4m/a1bY09iKz8Wn6as="
|
|||
|
|
Public Shared IVBase64 As String = "n869V+6/7Q11p049/wE99g=="
|
|||
|
|
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 使用 AES 加密字符串。
|
|||
|
|
''' </summary>
|
|||
|
|
''' <param name="plainText">要加密的明文字符串。</param>
|
|||
|
|
''' <param name="key">用于加密的密钥(必须是 AES 密钥大小,例如 128, 192 或 256 位)。</param>
|
|||
|
|
''' <param name="iv">初始化向量(IV),用于增加加密的随机性(必须是 AES 块大小,即 16 字节)。</param>
|
|||
|
|
''' <returns>Base64 编码的密文字符串。</returns>
|
|||
|
|
Public Shared Function EncryptStringAES(plainText As String, KeyBase64 As String, IVBase64 As String) As String
|
|||
|
|
Dim Key As Byte()
|
|||
|
|
Dim iv As Byte()
|
|||
|
|
Try
|
|||
|
|
Key = System.Convert.FromBase64String(KeyBase64)
|
|||
|
|
iv = System.Convert.FromBase64String(IVBase64)
|
|||
|
|
Catch ex As Exception
|
|||
|
|
Console.WriteLine("密钥和向量失败 err:", ex.Message)
|
|||
|
|
End Try
|
|||
|
|
' 检查输入是否有效
|
|||
|
|
If plainText Is Nothing OrElse plainText.Length <= 0 Then
|
|||
|
|
Throw New ArgumentNullException("plainText")
|
|||
|
|
End If
|
|||
|
|
If Key Is Nothing OrElse Key.Length <= 0 Then
|
|||
|
|
Throw New ArgumentNullException("key")
|
|||
|
|
End If
|
|||
|
|
If iv Is Nothing OrElse iv.Length <= 0 Then
|
|||
|
|
Throw New ArgumentNullException("iv")
|
|||
|
|
End If
|
|||
|
|
If Key.Length <> 16 AndAlso Key.Length <> 24 AndAlso Key.Length <> 32 Then
|
|||
|
|
Throw New ArgumentException("密钥长度必须为 128, 192 或 256 位 (16, 24 或 32 字节)。")
|
|||
|
|
End If
|
|||
|
|
If iv.Length <> 16 Then
|
|||
|
|
Throw New ArgumentException("IV 长度必须为 128 位 (16 字节)。")
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
Dim encrypted As Byte()
|
|||
|
|
|
|||
|
|
' 使用 AES 加密
|
|||
|
|
Using aesAlg As Aes = Aes.Create()
|
|||
|
|
aesAlg.Key = Key
|
|||
|
|
aesAlg.IV = iv
|
|||
|
|
|
|||
|
|
' 创建加密器
|
|||
|
|
Dim encryptor As ICryptoTransform = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV)
|
|||
|
|
|
|||
|
|
' 使用内存流进行加密
|
|||
|
|
Using msEncrypt As New MemoryStream()
|
|||
|
|
Using csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)
|
|||
|
|
Using swEncrypt As New StreamWriter(csEncrypt)
|
|||
|
|
' 将所有数据写入流。
|
|||
|
|
swEncrypt.Write(plainText)
|
|||
|
|
End Using
|
|||
|
|
encrypted = msEncrypt.ToArray()
|
|||
|
|
End Using
|
|||
|
|
End Using
|
|||
|
|
End Using
|
|||
|
|
|
|||
|
|
' 返回 Base64 编码的加密字节
|
|||
|
|
Return Convert.ToBase64String(encrypted)
|
|||
|
|
End Function
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 使用 AES 解密字符串。
|
|||
|
|
''' </summary>
|
|||
|
|
''' <param name="cipherText">要解密的 Base64 编码的密文字符串。</param>
|
|||
|
|
''' <param name="key">用于解密的密钥(必须与加密时使用的密钥相同)。</param>
|
|||
|
|
''' <param name="iv">用于解密的初始化向量(必须与加密时使用的 IV 相同)。</param>
|
|||
|
|
''' <returns>解密后的明文字符串。</returns>
|
|||
|
|
Public Shared Function DecryptStringAES(cipherText As String, keyBase As String, ivBase As String) As String
|
|||
|
|
Dim key As Byte()
|
|||
|
|
Dim iv As Byte()
|
|||
|
|
|
|||
|
|
Try
|
|||
|
|
key = Convert.FromBase64String(KeyBase64)
|
|||
|
|
iv = Convert.FromBase64String(IVBase64)
|
|||
|
|
Catch ex As Exception
|
|||
|
|
Console.WriteLine("密钥和向量失败 err:", ex.Message)
|
|||
|
|
End Try
|
|||
|
|
|
|||
|
|
' 检查输入是否有效
|
|||
|
|
If cipherText Is Nothing OrElse cipherText.Length <= 0 Then
|
|||
|
|
Throw New ArgumentNullException("cipherText")
|
|||
|
|
End If
|
|||
|
|
If key Is Nothing OrElse key.Length <= 0 Then
|
|||
|
|
Throw New ArgumentNullException("key")
|
|||
|
|
End If
|
|||
|
|
If iv Is Nothing OrElse iv.Length <= 0 Then
|
|||
|
|
Throw New ArgumentNullException("iv")
|
|||
|
|
End If
|
|||
|
|
If key.Length <> 16 AndAlso key.Length <> 24 AndAlso key.Length <> 32 Then
|
|||
|
|
Throw New ArgumentException("密钥长度必须为 128, 192 或 256 位 (16, 24 或 32 字节)。")
|
|||
|
|
End If
|
|||
|
|
If iv.Length <> 16 Then
|
|||
|
|
Throw New ArgumentException("IV 长度必须为 128 位 (16 字节)。")
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
' 将 Base64 编码的密文转换为字节数组
|
|||
|
|
Dim encryptedBytes As Byte() = Convert.FromBase64String(cipherText)
|
|||
|
|
|
|||
|
|
' 用于存储解密后的明文
|
|||
|
|
Dim plaintext As String = String.Empty
|
|||
|
|
|
|||
|
|
' 使用 AES 解密
|
|||
|
|
Using aesAlg As Aes = Aes.Create()
|
|||
|
|
aesAlg.Key = key
|
|||
|
|
aesAlg.IV = iv
|
|||
|
|
|
|||
|
|
' 创建解密器
|
|||
|
|
Dim decryptor As ICryptoTransform = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV)
|
|||
|
|
|
|||
|
|
' 使用内存流进行解密
|
|||
|
|
Using msDecrypt As New MemoryStream(encryptedBytes)
|
|||
|
|
Using csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)
|
|||
|
|
Using srDecrypt As New StreamReader(csDecrypt)
|
|||
|
|
' 从解密流中读取所有字节并将其解码为字符串。
|
|||
|
|
plaintext = srDecrypt.ReadToEnd()
|
|||
|
|
End Using
|
|||
|
|
End Using
|
|||
|
|
End Using
|
|||
|
|
End Using
|
|||
|
|
|
|||
|
|
Return plaintext
|
|||
|
|
End Function
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 生成一个随机的 AES 密钥。
|
|||
|
|
''' </summary>
|
|||
|
|
''' <param name="keySize">所需的密钥大小(以位为单位,例如 128, 192 或 256)。</param>
|
|||
|
|
''' <returns>随机生成的密钥字节数组。</returns>
|
|||
|
|
Public Shared Function GenerateRandomKey(keySize As Integer) As Byte()
|
|||
|
|
Using aesAlg As Aes = Aes.Create()
|
|||
|
|
aesAlg.KeySize = keySize
|
|||
|
|
aesAlg.GenerateKey()
|
|||
|
|
Return aesAlg.Key
|
|||
|
|
End Using
|
|||
|
|
End Function
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 生成一个随机的 AES 初始化向量 (IV)。
|
|||
|
|
''' </summary>
|
|||
|
|
''' <returns>随机生成的 IV 字节数组。</returns>
|
|||
|
|
Public Shared Function GenerateRandomIV() As Byte()
|
|||
|
|
Using aesAlg As Aes = Aes.Create()
|
|||
|
|
aesAlg.GenerateIV()
|
|||
|
|
Return aesAlg.IV
|
|||
|
|
End Using
|
|||
|
|
End Function
|
|||
|
|
|
|||
|
|
End Class
|