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

时间:2009-08-25 18:49:24

标签: vb.net encryption

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

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

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

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

我想以一种简单的方式安全地发送邮件。

感谢您的帮助!

3 个答案:

答案 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 DataDecrypting 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