在.NET中加密短字符串的最佳方法是什么?

8

我的老板希望我加密在数据传输过程中使用的一些信息。要加密的单个字符串长度在8到20个字符之间。必须使用单个密码进行加密和解密,因此我需要对称算法。我不想自己编写算法 - 我想从C#中使用内置的算法。

那么,哪种算法最好呢?


请查看此加密教程 - Syed Tayyab Ali
请查看我在此处发布的帖子:https://dev59.com/RHVC5IYBdhLWcg3wtzut - NotDan
2
EBG13. Vg'f fhpvqny rknzcyr gb! - Joey Robert
6个回答

8

我同意你的观点,DES对他来说是最好的选择。 - Syed Tayyab Ali
我对DES的唯一担忧是如何安全地进行密钥交换。 - James Black
1
此问题(密钥交换)适用于任何对称密码(当然,非对称也存在问题)。而且,OP明确请求使用对称密码。http://en.wikipedia.org/wiki/Key_exchange是一个很好的起点,但这是一个复杂的话题。 - Matthew Flaschen
不应该有问题。这是用于两个内部办事处之间交换银行详细信息的。 - Donovan

7

TripleDES是一个非常好的选择,但你也可以考虑使用AesCryptoServiceProvider(AES)作为现代对称加密算法。


3

.net安全类:

哈希

* MD5
* MD5Cng
* SHA1
* SHA1Managed
* SHA1Cng
* SHA256
* SHA256Managed
* SHA256Cng
* SHA384
* SHA384Managed
* SHA384Cng
* SHA512
* SHA512Managed
* SHA512Cng

对称加密:使用相同的密钥进行加密和解密。

* DES
* DESCryptoServiceProvider
* TripleDES
* TripleDESCryptoServiceProvider
* Aes
* AesCryptoServiceProvider
* AesManaged
* RC2
* RC2CryptoServiceProvider
* Rijandel
* RijandelManaged

非对称加密:使用不同的密钥进行加密和解密。

* DSA
* DSACryptoServiceProvider
* ECDsa
* ECDsaCng
* ECDiffieHellman
* ECDiffieHellmanCng
* RSA
* RSACryptoServideProvider

1
这是一个非常好的类名转储,但其中大多数与提交者无关(提交者想要对称加密算法),而不是哈希或非对称密码。 - Matthew Flaschen

3

这里是使用DES3加密的加密和解密函数。

''' <summary>
''' Encrypts a memory string (i.e. variable).
''' </summary>
''' <param name="data">String to be encrypted.</param>
''' <param name="key">Encryption key.</param>
''' <param name="iv">Encryption initialization vector.</param>
''' <returns>Encrypted string.</returns>
Public Shared Function Encrypt(ByVal data As String, ByVal key As String, ByVal iv As String) As String
    Dim bdata As Byte() = Encoding.ASCII.GetBytes(data)
    Dim bkey As Byte() = HexToBytes(key)
    Dim biv As Byte() = HexToBytes(iv)
    
    Dim stream As MemoryStream = New MemoryStream
    Dim encStream As CryptoStream = New CryptoStream(stream, des3.CreateEncryptor(bkey, biv), CryptoStreamMode.Write)
    
    encStream.Write(bdata, 0, bdata.Length)
    encStream.FlushFinalBlock()
    encStream.Close()
    
    Return BytesToHex(stream.ToArray())
End Function
    
''' <summary>
''' Decrypts a memory string (i.e. variable).
''' </summary>
''' <param name="data">String to be decrypted.</param>
''' <param name="key">Original encryption key.</param>
''' <param name="iv">Original initialization vector.</param>
''' <returns>Decrypted string.</returns>
Public Shared Function Decrypt(ByVal data As String, ByVal key As String, ByVal iv As String) As String
    Dim bdata As Byte() = HexToBytes(data)
    Dim bkey As Byte() = HexToBytes(key)
    Dim biv As Byte() = HexToBytes(iv)
    
    Dim stream As MemoryStream = New MemoryStream
    Dim encStream As CryptoStream = New CryptoStream(stream, des3.CreateDecryptor(bkey, biv), CryptoStreamMode.Write)
    
    encStream.Write(bdata, 0, bdata.Length)
    encStream.FlushFinalBlock()
    encStream.Close()
    
    Return Encoding.ASCII.GetString(stream.ToArray())
End Function

1

你可以使用RSA加密,因为这些是短字符串,这将使密钥交换更简单。

RSA加密的加密量取决于密钥长度。

我是Bouncy Castle库中rsa库的粉丝。


0

DES现在基本上已经过时了。这里是Wikipedia。如果你需要频繁更换密钥,那么DES可能还可以,但是如果你要长期依赖一个密钥,AES似乎是更好的选择。

当然这也取决于你需要多少保护。但是AES也是内置的。

我已经使用AES加密了一些小字符串,它的效果很不错。

根据我所了解的TripleDES,由于DES很容易被破解,因此TripleDES仍然不太可靠。


2
实际上,维基百科(http://en.wikipedia.org/wiki/TripleDES#Security)和NIST(http://csrc.nist.gov/publications/nistpubs/800-57/SP800-57-Part1.pdf)(第66页)表明,TripleDES被预计保持安全性直到2030年。 - Matthew Flaschen
1
从互联网档案馆获取的原始NIST文件修订后的NIST文件(2007年)对Triple DES达成了相同的结论。 - Matthew Flaschen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接