C# 带指针的AES加密

C# 带指针的AES加密,c#,.net,security,pointers,encryption,C#,.net,Security,Pointers,Encryption,我在用电话 Aes 类来加密某些字节。我可以打电话 CreateEncryptor 方法获取一个ICryptoTransform,然后从那里适当地使用它。但是,我加密的数据是指向某个内存的指针。(a字节*)。ICryptoTransform只接受字节[] 我的问题是,在将指针用于AES之前,是否必须将其复制到托管数组中?是的,您必须复制。来自非托管库的非托管指针byte*将不具有托管的byte[]所具有的额外信息,即长度、类型句柄,以便CLR知道此内存所指的类型以及lock关键字所使用的同步

我在用电话

Aes
类来加密某些字节。我可以打电话

CreateEncryptor
方法获取一个
ICryptoTransform
,然后从那里适当地使用它。但是,我加密的数据是指向某个内存的指针。(a
字节*
)。ICryptoTransform只接受
字节[]


我的问题是,在将指针用于AES之前,是否必须将其复制到托管数组中?

是的,您必须复制。来自非托管库的非托管指针
byte*
将不具有托管的
byte[]
所具有的额外信息,即长度、类型句柄,以便CLR知道此内存所指的类型以及lock关键字所使用的同步块索引

因此,任何期望
字节[]
的托管方法都期望传递的数组符合.NET对象格式。 例如,如果
ICryptoTransform
方法试图访问数组的长度,它将无法在非托管
字节*
指针中找到它。如果它试图使用
lock
关键字获得
byte[]
数组上的锁,则需要同步块索引等


相反,您可以使用
fixed
关键字获取指向
byte[]
数组中第一个元素的指针。这是因为需要
byte*
的代码不关心
byte[]
中的额外信息(尽管许多非托管代码可能关心长度,并要求您将长度作为单独的参数传递)。

您是如何为数组创建内存的?数组大小是否一致?@MichaelRandall对于数组的内存,我假定您指的是指针(即数据源)。该指针来自非托管内存。是的,指针的大小是一致的,直到最后一个块。
字节*
从哪里来。C#程序通常不处理pointers@Flydog57字节*来自非托管库。如果您试图保存最后一次分配,则无法在此处执行任何操作。使用span是没有意义的,因为您必须调用ToArray,我看到的唯一实际选项是使用静态缓冲区,它可以保存持续的分配,但不会是线程安全的。事件,然后你将需要投下它,这是有一些黑客以及。我早料到会这样。我希望它仍然会很快。