使用字符串作为密钥的 vb.net 中的安全(ish)加密/解密算法

Cyc*_*one 1 vb.net encryption

有没有办法使用另一个字符串作为密钥在 VB.net 中加密/解密文本(字符串形式)?意思是,如果一个用户使用这个密钥加密,另一个用户需要使用相同的密钥解密?

我的意思不是公钥和私钥加密或任何类型的加密。

有人可以帮我为这些建造两个潜艇吗?

如果不是,那么在没有公钥/私钥的情况下加密/解密数据的第二好方法是什么?

我想做一个简单的方法来安全地发送消息。

谢谢您的帮助!

Mar*_*rkL 5

如上一个答案中所述,对称算法(其中使用单个密钥进行加密和解密)可以工作。我碰巧手头有 DES 算法的用法。此加密例程返回加密过程的输出(并且解密具有作为输入)一个 base64 编码字符串而不是字节数组(这是框架加密类的“自然”输出)。

Private key() As Byte = {}
Private IV() As Byte = {&H12, &H34, &H56, &H78, &H90, &HAB, &HCD, &HEF}
Private Const EncryptionKey As String = "abcdefgh"
Public Function Decrypt(ByVal stringToDecrypt As String) As String
    Try
        Dim inputByteArray(stringToDecrypt.Length) As Byte
        key = System.Text.Encoding.UTF8.GetBytes(Left(EncryptionKey, 8))
        Dim des As New DESCryptoServiceProvider
        inputByteArray = Convert.FromBase64String(stringToDecrypt)
        Dim ms As New MemoryStream
        Dim cs As New CryptoStream(ms, des.CreateDecryptor(key, IV), CryptoStreamMode.Write)
        cs.Write(inputByteArray, 0, inputByteArray.Length)
        cs.FlushFinalBlock()
        Dim encoding As System.Text.Encoding = System.Text.Encoding.UTF8
        Return encoding.GetString(ms.ToArray())
    Catch ex As Exception
        'oops - add your exception logic
    End Try
End Function

Public Function Encrypt(ByVal stringToEncrypt As String) As String
    Try
        key = System.Text.Encoding.UTF8.GetBytes(Left(EncryptionKey, 8))
        Dim des As New DESCryptoServiceProvider
        Dim inputByteArray() As Byte = Encoding.UTF8.GetBytes(stringToEncrypt)
        Dim ms As New MemoryStream
        Dim cs As New CryptoStream(ms, des.CreateEncryptor(key, IV), CryptoStreamMode.Write)
        cs.Write(inputByteArray, 0, inputByteArray.Length)
        cs.FlushFinalBlock()
        Return Convert.ToBase64String(ms.ToArray())
    Catch ex As Exception
        'oops - add your exception logic
    End Try
End Function
Run Code Online (Sandbox Code Playgroud)

编辑添加:
这是我在该模块中的导入:

Imports System
Imports System.IO
Imports System.Xml
Imports System.Text
Imports System.Security.Cryptography
Run Code Online (Sandbox Code Playgroud)

DES 密钥的长度为 56 位(仅短于 8 个字节或字符)。在“大局”中,如今这被认为不是很安全(请参阅有关密钥大小的这篇维基百科文章),但正如您所描述的“安全”,也许没问题。如果您确实需要更安全的加密,则应该使用一种更安全的算法进行调查。

上述例程中的加密密钥在私有常量 EncryptionKey 中。将该值更改为您想要的键。或者您可以实现自己的密钥管理(从文件输入、询问用户等)。

不知道为什么 Left 和 Convert 会被打破。Left 是 Microsoft.VisualBasic.Strings 的成员,Convert 是 System 的成员。

我强烈建议您阅读 Remus Rusanu 链接的文章,以及从这些文章链接的其他文章。他们将为您提供有关框架类中加密的很多背景知识。