当前位置: 首页 > 知识库问答 >
问题:

在C#.NET3.5中加密和解密字符串

闾丘书
2023-03-14

我知道有几个与此相关的问题,但是大多数答案都提供了.NET4.0及以上版本的解决方案。对于我的用途,我必须以.NET3.5为目标。我想简单地加密和解密一个字符串存储在一个文件中,所讨论的文本不是敏感的用户/个人信息。

public static string EncryptString(this string text)
{
    string result = null;
    if(!String.IsNullOrEmpty(text))
    {
        byte [] plaintextBytes = Encoding.Unicode.GetBytes ( text );
        SymmetricAlgorithm symmetricAlgorithm = DES.Create ();
        symmetricAlgorithm.Key = new byte [8] { 1, 2, 3, 4, 5, 6, 7, 8 };
        MemoryStream memoryStream = new MemoryStream ();
        CryptoStream cryptoStream = new CryptoStream ( memoryStream, symmetricAlgorithm.CreateEncryptor (), CryptoStreamMode.Write );
        cryptoStream.Write ( plaintextBytes, 0, plaintextBytes.Length );
        result = Encoding.Unicode.GetString ( memoryStream.ToArray () );
        }
    return result;
}
public static string DecryptString(this string text)
{
    string result = null;
    if ( !String.IsNullOrEmpty ( text ) )
    {
        byte [] encryptedBytes = Encoding.Unicode.GetBytes ( text );
        SymmetricAlgorithm symmetricAlgorithm = DES.Create ();
        symmetricAlgorithm.Key = new byte [8] { 1, 2, 3, 4, 5, 6, 7, 8 };
        MemoryStream memoryStream = new MemoryStream ( encryptedBytes );
        CryptoStream cryptoStream = new CryptoStream ( memoryStream, symmetricAlgorithm.CreateDecryptor (), CryptoStreamMode.Read );
        byte [] decryptedBytes = new byte [encryptedBytes.Length];
        cryptoStream.Read ( decryptedBytes, 0, decryptedBytes.Length );
        result = Encoding.Unicode.GetString ( decryptedBytes );
    }
    return result;
}

CryptographicException:错误的PKCS7填充。长度0无效。

共有1个答案

公冶昆杰
2023-03-14

我想出的答案需要对代码进行彻底修改,但效果很好,它是:

public static string EncryptString(this string text, string passPhrase)
{
    string result = null;
    if(!String.IsNullOrEmpty(text))
    {
        byte [] initVectorBytes = Encoding.UTF8.GetBytes ( m_InitVector );
        byte [] plainTextBytes = Encoding.UTF8.GetBytes ( text );
        PasswordDeriveBytes password = new PasswordDeriveBytes ( passPhrase, null );
        byte [] keyBytes = password.GetBytes ( m_Keysize / 8 );
        RijndaelManaged symmetricKey = new RijndaelManaged ();
        symmetricKey.Mode = CipherMode.CBC;
        ICryptoTransform encryptor = symmetricKey.CreateEncryptor ( keyBytes, initVectorBytes );
        MemoryStream memoryStream = new MemoryStream ();
        CryptoStream cryptoStream = new CryptoStream ( memoryStream, encryptor,  CryptoStreamMode.Write );
        cryptoStream.Write ( plainTextBytes, 0, plainTextBytes.Length );
        cryptoStream.FlushFinalBlock ();
        byte [] cipherTextBytes = memoryStream.ToArray ();
        memoryStream.Close ();
        cryptoStream.Close ();
        result = Convert.ToBase64String ( cipherTextBytes );
    }
    return result;
}

而且

public static string DecryptString(this string text, string passPhrase)
{
    string result = null;
    if ( !String.IsNullOrEmpty ( text ) )
    {
        byte [] initVectorBytes = Encoding.UTF8.GetBytes ( m_InitVector );
        byte [] cipherTextBytes = Convert.FromBase64String ( text );
        PasswordDeriveBytes password = new PasswordDeriveBytes ( passPhrase, null );
        byte [] keyBytes = password.GetBytes ( m_Keysize / 8 );
        RijndaelManaged symmetricKey = new RijndaelManaged ();
        symmetricKey.Mode = CipherMode.CBC;
        ICryptoTransform decryptor = symmetricKey.CreateDecryptor ( keyBytes, initVectorBytes );
        MemoryStream memoryStream = new MemoryStream ( cipherTextBytes );
        CryptoStream cryptoStream = new CryptoStream ( memoryStream, decryptor, CryptoStreamMode.Read );
        byte [] plainTextBytes = new byte [cipherTextBytes.Length];
        int decryptedByteCount = cryptoStream.Read ( plainTextBytes, 0, plainTextBytes.Length );
        memoryStream.Close ();
        cryptoStream.Close ();
        result = Encoding.UTF8.GetString ( plainTextBytes, 0, decryptedByteCount );
    }
    return result;
}
 类似资料:
  • 我感兴趣的是构建一个个人使用的小应用程序,它将使用JavaScript在客户端加密和解密信息。加密的信息将存储在服务器上的数据库中,但不会存储解密的版本。 它不一定要是超级duper安全的,但我想使用一个当前未中断的算法。 理想情况下我可以做一些 生成编码字符串,以及类似于 以后再解码。 到目前为止,我已经看到了以下内容:http://bitwiseshiftleft.github.io/sjcl

  • 问题内容: 我是密码学的新手。我希望学习如何在文件中加密和解密文本……当我在net中引用相关文章时。我怀疑对同一文本进行多次加密后,单个文本的加密文本是否会相同?谁能解决我的疑问? 问题答案: 这是使用该类的示例:

  • 问题内容: 我的意思是: 也许像: 在PHP中,您该怎么做? 尝试使用 ,但对我不起作用。 问题答案: 更新 PHP 7就绪版本。它使用PHP OpenSSL库中的openssl_encrypt函数。

  • 我想使用chacha20解密和加密字符串 BouncyCastleProvider正在使用chacha20技术。所以我包括了罐子。并尝试了代码,但无法工作。 pbe.java

  • 我的意思是: 可能是这样的: null 尝试使用,但对我不起作用。

  • 我将我的. net webapi移植到. net core webapi。在我使用的旧代码中 为此,我使用了库 但在移植到.net core之后,我面临的问题是: 对此的解决方案是什么?