有没有办法使用另一个字符串作为密钥在VB.net中加密/解密文本(字符串形式)?这意味着,如果一个用户使用此密钥加密,则另一个用户需要使用相同的密钥进行解密?
我不是指公钥和私钥加密或任何类型的加密。
有人可以帮我为这些构建两个潜艇吗?
如果没有,在没有公钥/私钥的情况下加密/解密数据的第二种最佳方法是什么?
我想以一种简单的方式安全地发送邮件。
感谢您的帮助!
答案 0 :(得分:4)
如前面的答案所述,对称算法(使用单个密钥加密和解密)可以工作。我碰巧使用了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
编辑添加:
以下是我在该模块中的Imports:
Imports System
Imports System.IO
Imports System.Xml
Imports System.Text
Imports System.Security.Cryptography
DES密钥长度为56位(短至8个字节或字符)。在一幅“大图”中,这些日子并不被认为是非常安全的(见this Wikipedia article on key sizes),但正如你所描述的那样'安全 - 是',也许这没关系。如果确实需要更安全的加密,则应使用其中一种更安全的算法进行调查。
上述例程中的加密密钥位于私有常量EncryptionKey中。将该值更改为所需的键。或者您可以实现自己的密钥管理(从文件输入,询问用户等)。
不确定为什么Left和Convert会被打破。 Left是Microsoft.VisualBasic.Strings的成员,Convert是System。
的成员我强烈建议您阅读由Remus Rusanu链接的文章,以及与之相关的其他文章。他们将为您提供框架类加密的大量背景知识。
答案 1 :(得分:1)
MSDN有几个关于如何使用对称密钥加密和解密数据的示例(这正是您想要的)。最简单的使用是CryptoStream,您可以在普通内存流或文件流之上构建加密流,写入加密流并将加密数据写入内存/文件流,并解密您将加密流附加到加密字符串(内存流)或文件流,并从加密流中读取解密数据:Encrypting Data和Decrypting Data。
另一个示例是SymmetricAlgorithm示例中的示例,它显示了对称密钥的基本用法,没有流助手的装备。
答案 2 :(得分:0)
下面的代码剪辑使用简单的xor math语句(exclusive或)使用密码加密/解密数据字符串。
'datain = data to be encrypted
'password is string to encrypt datain
'
'passwprd pointer to start
kep= 0
'len of data to be encrypted
d = Len(datain$)
'ddataout$ is encrypted string
dataout$=""
For n = 1 To d
kep=kep+1 : 'point to password location
i$ = Mid(password$, kep, 1) : 'get character from password
p = Asc(i$) : 'convert character to integer
x$= Mid(datain$,n,1) : 'get character from datain
h = Asc(x$) : 'convert character to integer
f = h Xor p : 'xor the two values and put result in integer
o$ = Chr(f) : 'convert integer back to character
dataout$ = dataout$ + o$
If kep = Len(password$) Then
kep = 0 : 'reset password pointer to first character
End If
Next n
' output string dataout$ contains encrypted data
'dataout = data to be dencrypted
'password is string to dencrypt datain
'
'passwprd pointer set to start
kep= 0
'len of data to be encrypted
d = Len(dataout$)
'ddataout$ is encrypted string
datain$=""
For n = 1 To d
kep=kep+1 : ' point to password location
i$ = Mid(password$, kep, 1) : 'get character from password
p = Asc(i$) : ' convert character to integer
x$= Mid(dataout$,n,1) : ' get character from dataout
h = Asc(x$) : 'convert character to integer
f = h Xor p :' xor the two values and put result in integer
o$ = Chr(f) :' convert integer back to character
datain$ = datain$ + o$ : ' built datain string
If kep = Len(password$) Then
kep = 0 : 'reset password pointer to first character
End If
Next n
'output string datain$ contains decrypted data