- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有两个非常简单的方法来使用 AesCryptoServiceProvider 加密/解密 byte[]。但我对该方法的性能感到非常惊讶。
我尝试加密和解密尽可能多的字节[],在前 4 秒内我可以加密大约 2000 次,但在接下来的 4 秒内,大约 1000 次,在接下来的四秒内,大约 500 次。 .. 最后我每 4 秒可以进行大约 80 次操作。为什么?
看代码。
namespace Encrypttest
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;
using System.Globalization;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("AES provider");
var key = GenerateKey();
DateTime now = DateTime.Now.AddSeconds(2);
var toStop = now.AddSeconds(120);
long operations = 0;
byte[] buffer = new byte[16];
byte[] result = new byte[buffer.Length];
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = 2;
}
for (long i = 0; i < 10000000; i++)
{
result = Encrypt(buffer, key);
Decrypt(result, key);
buffer = result;
operations++;
if (DateTime.Now > now)
{
Console.WriteLine(now.ToLongTimeString() + ";" + operations + ";" + System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64);
operations = 0;
now = DateTime.Now.AddSeconds(2);
}
if (toStop < DateTime.Now)
{
break;
}
}
}
/// <summary>
/// Encrypts the specified data.
/// </summary>
/// <param name="data">The data to encrypt</param>
/// <param name="key">The key to encrypt data.</param>
/// <returns>
/// The data encrypted.
/// </returns>
public static byte[] Encrypt(byte[] data, SymmetricKey key)
{
if (data == null || data.Length == 0)
{
throw new ArgumentNullException("data");
}
if (key == null)
{
throw new ArgumentNullException("key");
}
using (AesCryptoServiceProvider providerInLine = new AesCryptoServiceProvider())
{
using (MemoryStream stream = new MemoryStream())
{
using (ICryptoTransform cryptoEncryptor = providerInLine.CreateEncryptor(key.Key, key.IV))
{
using (CryptoStream writerStream = new CryptoStream(stream, cryptoEncryptor, CryptoStreamMode.Write))
{
writerStream.Write(data, 0, data.Length);
writerStream.FlushFinalBlock();
return stream.ToArray();
}
}
}
}
}
/// <summary>
/// Decrypts the specified data.
/// </summary>
/// <param name="data">The data to decrypt</param>
/// <param name="key">The key to decrypt data.</param>
/// <returns>
/// The data encrypted.
/// </returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")]
public static byte[] Decrypt(byte[] data, SymmetricKey key)
{
if (data == null || data.Length == 0)
{
throw new ArgumentNullException("data");
}
if (key == null)
{
throw new ArgumentNullException("key");
}
using (AesCryptoServiceProvider provider = new AesCryptoServiceProvider())
{
using (MemoryStream memStreamEncryptData = new MemoryStream(data))
{
using (ICryptoTransform cryptoDecryptor = provider.CreateDecryptor(key.Key, key.IV))
{
using (CryptoStream stream = new CryptoStream(memStreamEncryptData, cryptoDecryptor, CryptoStreamMode.Read))
{
byte[] plainTextBytes = new byte[data.Length];
stream.Read(plainTextBytes, 0, plainTextBytes.Length);
return plainTextBytes;
}
}
}
}
}
/// <summary>
/// Generates a random key and initialization vector
/// </summary>
/// <returns>
/// The key and initialization vector.
/// </returns>
public static SymmetricKey GenerateKey()
{
using (AesCryptoServiceProvider provider = new AesCryptoServiceProvider())
{
provider.GenerateKey();
SymmetricKey key = new SymmetricKey(provider.Key, provider.IV);
return key;
}
}
}
public class SymmetricKey
{
/// <summary>
/// The key.
/// </summary>
private byte[] key;
/// <summary>
/// The initialization vector.
/// </summary>
private byte[] iv;
/// <summary>
/// Initializes a new instance of the <see cref="SymmetricKey"/> class.
/// </summary>
public SymmetricKey()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="SymmetricKey"/> class.
/// </summary>
/// <param name="key">The key.</param>
/// <param name="iv">The iv.</param>
public SymmetricKey(byte[] key, byte[] iv)
{
this.Init(key, iv);
}
/// <summary>
/// Gets the key.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Justification = "Byte[] is what the providers need")]
public byte[] Key
{
get { return this.key; }
}
/// <summary>
/// Gets the iv.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Justification = "Byte[] is what the providers need")]
public byte[] IV
{
get { return this.iv; }
}
/// <summary>
/// Loads the specified key and iv
/// </summary>
/// <param name="newKey">The key.</param>
/// <param name="newIV">The iv.</param>
public void Init(byte[] newKey, byte[] newIV)
{
this.key = newKey;
this.iv = newIV;
}
}
}
最佳答案
由于填充,密文比明文大16字节。由于您将一次迭代的密文用作下一次迭代的明文,因此缓冲区的长度会随着迭代次数线性增长。这解释了速度放缓的原因。
2000次迭代后每次迭代需要加密30kB,6000次迭代后每次迭代需要加密100kB...
关于c# - AesCryptoServiceProvider,性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9307932/
如果我尝试使用来自面临严格加密导出限制的国家/地区的 AESCryptoServiceProvider,会发生什么情况? 它会起作用吗? 我会收到 PlatformNotSupportedExcept
我有两个非常简单的方法来使用 AesCryptoServiceProvider 加密/解密 byte[]。但我对该方法的性能感到非常惊讶。 我尝试加密和解密尽可能多的字节[],在前 4 秒内我可以加密
我遇到了以下问题。 我创建了一个类,它使用 AesCryptoServiceProvider 来加密和解密一些数据。我在 SharePoint WebPart 中使用该类,一切正常。我还在自定义 Sh
我有以下代码使用 AesCryptoServiceProvider 进行加密和解密。 iv 和key 用于加密和解密。解密后的值仍然与源字符串不同。 解密后需要修正什么才能得到原始值? 此代码在 in
AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider() var iv = aesAlg.GenerateIV(); 你知道iv
我正在使用我的应用程序的 iPad 版本,我在使用 AesCryptoServiceProvider 时有一个功能,例如以下几行 using (AesCryptoServiceProvider ae
我正在使用 MSDN 中的 EncryptStringToBytes_Aes 方法使用像这样的自定义密码加密一些数据: string original = "some data to encrypt"
我的问题实际上比如何在 VB.NET 中使用 AES 更复杂一些,因为我真正想做的是在跨 JACOB 的 Java 应用程序中在 VB.NET 中使用 AES。但现在,我需要关注的是 AES 实现本身
我编写了一个使用 AES 加密的 BlackBerry 应用程序。我正在尝试使用 C# 中的 AesCryptoServiceProvider 对此进行解密。 BlackBerry 代码似乎没有使用
我正在使用 AesCryptoServiceProvider 和 CryptoStream 来加密一些数据,当我使用相同的 key 进行解密时,它似乎工作正常。但是,如果我尝试用错误的 key 解密它
我需要使用 AES 加密数据。在研究时我发现了 AesCryptoServiceProvider类。 我对加密知之甚少,也不知道初始化向量 (IV) 是什么,所以我尝试在堆栈溢出中搜索 AES 示例,
这是我运行的示例。它具有相同的Mode、Padding、BlockSize、KeySize。我使用相同的初始化向量、 key 和数据。 使用 RijndaelManaged 生成加密值:0x8d,0x
我认为区别因素是 AesCryptoServiceProvider 符合 FIPS AesManaged 是跨平台的,需要 .NET 3.0 RijndaelManaged 在 .NET 2.0 上运
.net 2.0 中 AesCryptoServiceProvider(存在于 system.Core -.net 4- 中)的替代品是什么? 最佳答案 在 .Net 2.0 中,您将使用 Rijnd
我们有一个 C# (.net 3.5) 应用程序。在安装过程中,我们使用 AesCryptoServiceProvider 对配置文件中的一些有用信息进行加密。这些信息将在应用程序运行时被解密。所以应
我需要使用标准 C# AesCryptoServiceProvider 解密数据,它在 Java 端使用 Bouncy CaSTLe AesFastEngine 加密。 (使用Bounca CaSTL
我是一名优秀的程序员,十分优秀!