标签: aescryptoserviceprovider

良好的AES初始化矢量实践

根据我的问题Aes Encryption ...错过了一个重要的部分,我现在已经了解到我在字符串上创建可逆加密的假设有点过时了.我现在有

    public static byte[] EncryptString(string toEncrypt, byte[] encryptionKey)
    {
        var toEncryptBytes = Encoding.UTF8.GetBytes(toEncrypt);
        using (var provider = new AesCryptoServiceProvider())
        {
            provider.Key = encryptionKey;
            provider.Mode = CipherMode.CBC;
            provider.Padding = PaddingMode.PKCS7;
            using (var encryptor = provider.CreateEncryptor(provider.Key, provider.IV))
            {
                using (var ms = new MemoryStream())
                {
                    using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                    {
                        cs.Write(toEncryptBytes, 0, toEncryptBytes.Length);
                        cs.FlushFinalBlock();
                    }
                    return ms.ToArray();
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这产生了一致的结果; 但是,如果不知道/设置初始化向量,我将无法解密.我真的不想将三个值传递给这个方法(在IV上),这让我硬编码IV或从密钥中导出它.我想知道这是不是一个好的做法,或者它是否会使加密的值容易受到某种程度的攻击......或者我是否真的过度思考这个并且应该硬编码IV?

更新 根据铱星的建议,我尝试了类似的东西:

    public static byte[] EncryptString(string toEncrypt, byte[] encryptionKey)
    {
        if …
Run Code Online (Sandbox Code Playgroud)

c# aescryptoserviceprovider initialization-vector

50
推荐指数
5
解决办法
6万
查看次数

为什么RijndaelManaged和AesCryptoServiceProvider会返回不同的结果?

这是我运行的例子.它具有相同的Mode,Padding,BlockSize,KeySize.我使用相同的init向量,密钥和数据.

使用RijndaelManaged产生加密值:0x8d,0x81,0x27,0xc6,0x3c,0xe2,0x53,0x2f,0x35,0x78,0x90,0xc2,0x2e,0x3b,0x8a,0x61,0x41,0x47,0xd6,0xd0,0xff ,0x92,0x72,0x3d,0xc6,0x16,0x2b,0xd8,0xb5,0xd9,0x12,0x85

使用AesCryptoServiceProvider生成加密值:0x8d,0x9f,0x6e,0x99,0xe9,0x54,0x8b,0x12,0xa9,0x88,0x1a,0x3d,0x65,0x23,0x9c,0x4e,0x18,0x5a,0x89,0x31,0xf5 ,0x75,0xc5,0x9e,0X0D,0x43,0xe9,0x86,0xd4,0xf3,0x64,0x3a

这是我用来生成这些结果的代码


   public partial class AesTest
   {
      private SymmetricAlgorithm mEncryptionType;
      private byte[] mPrivateKey;
      private byte[] mInitializationVector;
      private byte[] mData;

      public AesTest()
      {
         mPrivateKey = new byte[32] 
         { 
            0x22, 0x22, 0x22, 0x22, 
            0x22, 0x22, 0x22, 0x22, 
            0x22, 0x22, 0x22, 0x22, 
            0x22, 0x22, 0x22, 0x22,
            0x22, 0x22, 0x22, 0x22, 
            0x22, 0x22, 0x22, 0x22, 
            0x22, 0x22, 0x22, 0x22, 
            0x22, 0x22, 0x22, 0x22
         };

         mInitializationVector = new byte[16]
         { 
            0x33, 0x33, 0x33, 0x33,
            0x33, 0x33, 0x33, 0x33,
            0x33, 0x33, 0x33, …
Run Code Online (Sandbox Code Playgroud)

.net c# encryption rijndaelmanaged aescryptoserviceprovider

33
推荐指数
2
解决办法
3万
查看次数

为什么我的解密文本中出现了随机字符?

介绍

我正在尝试加密和解密文本,有时,特别是对于较大的文本,随机字符出现在解密的文本中.我在System.Security.Cryptography命名空间内使用AES加密技术,我正在尝试加密的文本将是一个URL和一些信息,例如页面标题.我在下面提供了一个例子以及我尝试过的内容.我还编写了两种加密和解密方法,减去输出到调试窗口的任何行.使用的Key和IV应该不是问题,因为现在它们将是不变的.

我认为明智的做法是指出它18/01/2013;18/01/2013在预期的单独事件中加密和解密.

说我想解密这个文本:

Barnabe Googes Information & Homepage | Search and Research on BarnabeGooge.com;18/01/2013;18/01/2013;;http://www.googe.com

默认情况下,它使用UTF-8,它将加密为:

?????????????????????????????????????????????????????????????????

并解密回:

Barnabe Googes Information & Homepage | Search and Research on B???Ax2?!??f?M]18/01/20?;18/01[?;>??l?????m??*-??+??^A[=?

我尝试过的

  • 我试图改为其他编码,但UTF-8似乎对解密文本的影响最小.
  • 改为不同类型的填充,但Padding.Zeros似乎是最好的.我也不能使用,Padding.None因为它抛出了NotSupportedException: bad data length.
  • 改为ModeCBC(不是它应该重要).
  • 刷新/关闭CryptoStream以便它可以刷新最后的块或其他东西.
  • 为了防止故障与标题有关,我习惯WebUtility.HtmlDecode()解码标题,但它并没有影响它.

加密方法

您可以看到,下面的加密使用AES加密.我想指出,key并且IV这两个全局字符串与加密和解密方法在同一个类中.我这样做的原因是乱搞不同的编码,并且CryptographyServiceProviders,如果偶然的随机变化有效.请忽略它们,因为它们是不变的,不会影响最终的加密/解密.

public static byte[] EncryptStringToBytes(string plainText, Encoding Enc)
{

    if (plainText == null || plainText.Length <= 0)
            throw new ArgumentNullException("plainText"); …
Run Code Online (Sandbox Code Playgroud)

c# cryptography aes aescryptoserviceprovider

10
推荐指数
1
解决办法
2976
查看次数

AES合法密钥大小是否真的是限制?

AesCryptoServiceProvider.LegalKeySizes字段显示允许的位大小.

但是,我不明白的是,如果这些是真的,我怎么能成功利用2048位密钥长度(256字节)?

我想我的真正问题是,我的密钥是否产生了所请求的大小(大于最大32字节),但是在加密/解密过程中实际只采用了前32字节(256位),从而呈现更大的密钥大小浪费空间?

我不知道是否有一种方法可以实际告知API中暴露的内容......

有什么想法吗?也许我是以错误的方式看待这个?

c# aes aescryptoserviceprovider

9
推荐指数
1
解决办法
6357
查看次数

AES的四分之一字节和AES密钥是多少?

我在C#/ .Net Framework中使用AESCryptoServiceProvider,我想知道IV和Keys有多大(以字节为单位).我很确定这个课程遵循AES的规格,所以如果有人有任何想法,我会很高兴听到它:)

c# encryption aescryptoserviceprovider

7
推荐指数
1
解决办法
5202
查看次数

如何使用System.Cryptography解密EncryptedAssertion

身份提供程序使用component pro的功能加密Saml Assertion

Dim encryptedSamlAssertion As New EncryptedAssertion(samlAssertion, encryptingCert, New System.Security.Cryptography.Xml.EncryptionMethod(SamlKeyAlgorithm.Aes256Cbc))
Run Code Online (Sandbox Code Playgroud)

在服务提供商,我试图解密断言.但我不能使用组件专业版.我必须使用System.Security.Cryptography

  • X509Certificate用于加密和解密
  • Aes256Cbc是加密算法

请帮助我提供一些有关如何使用X509Certificate和Aes256Cbc算法实现SamlAssertions解密的更多信息

.net c# x509certificate2 aescryptoserviceprovider saml-2.0

6
推荐指数
1
解决办法
1067
查看次数

是否存储初始化向量-单独的字段?

使用.NET加密敏感信息时 AesCryptoServiceProvider库我为每个加密的值生成一个唯一的初始化向量(IV)。在保存加密数据的数据库记录中,我有一个名为“ IV”的字段,该字段存储用于稍后解密的初始化向量。

可以将初始化矢量与密文一起存储吗?通过将IV附加到密文中也许呢?如果是这样,是否有标准方法?

encryption aes aescryptoserviceprovider initialization-vector

4
推荐指数
1
解决办法
623
查看次数

指定的初始化向量(IV)与此算法的块大小不匹配

   public static string GenerateKey()
   {
        AesCryptoServiceProvider aesCrypto = (AesCryptoServiceProvider)AesCryptoServiceProvider.Create();

        // Use the Automatically generated key for Encryption. 
        return ASCIIEncoding.ASCII.GetString(aesCrypto.Key);
    }

    static void EncryptFile(string sInputFilename, string sOutputFilename, string sKey)
    {
        FileStream fsInput = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);

        FileStream fsEncrypted = new FileStream(sOutputFilename, FileMode.Create, FileAccess.Write);
        AesCryptoServiceProvider AES = new AesCryptoServiceProvider();
        // Sets the appropriate block size for the AES Encryption Method
        AES.BlockSize = 128;
        AES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
        AES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
        ICryptoTransform aesencrypt = AES.CreateEncryptor();
        CryptoStream cryptostream = new CryptoStream(fsEncrypted, aesencrypt, CryptoStreamMode.Write);

        byte[] …
Run Code Online (Sandbox Code Playgroud)

.net c# aes aescryptoserviceprovider visual-studio-2008

3
推荐指数
1
解决办法
8992
查看次数

AES 及其密码模式

我正在尝试使用 AES 进行加密/解密,然后我尝试了 CBC 和 ECB 模式,我从所有三个模式中都获得了相同的加密输出!这是怎么回事?
这可能没有错,但我只是不知道会发生什么。如果它们都产生相同的密码,那么拥有模式有什么意义?是时间复杂度还是性能复杂度?

你能解释一下 AES 和它的密码模式之间的区别吗?什么是默认密码模式?或者如果你能给我任何参考,因为 MSDN 不够清楚

谢谢你

c# encryption cryptography encryption-symmetric aescryptoserviceprovider

2
推荐指数
1
解决办法
4261
查看次数