这让我很难受。我以为我正在设置密钥,但我不是。没有例外,除了糟糕的结果之外没有任为什么有一个setter如果一切都被忽略了,当我尝试写时没有抛出异常? Keys属性的setter有什么意义?
当我这样做时,以下键值不会改变。一小时后,当我意识到发生了什么时,我写了循环来验证。我也试过aes.Key [0] = val; var b = val == aes.Key [0]; (并以立即模式与它混淆)。
为什么会出现这种情况?
Array.Copy(myKey, aes.Key, aes.Key.Length);
int i = 0;
foreach (var v in aes.Key)
{
var b = myKey[i++] == v;
if (!b)
b = b;
}
答案 0 :(得分:2)
嗯,首先,你没有使用二传手。你正在做的是使用getter(它抓取密钥的 copy ),并在getter返回的key数组的副本中设置单个字节(这不会影响内部状态AesCryptoServiceProvider
)。
如果您希望setter正常工作,请创建一个新的byte
数组并设置属性:
byte[] newKey = new byte[aes.KeySize / 8];
// generate your key...
aes.Key = newKey;
您的示例完全在托管代码中,并且您明确地返回对字节数组DummyArray
的直接引用,因此您可以自然地设置您选择的任何索引,因为您已选择返回引用。但是,没有要求说必须返回对字节数组的引用(这是一个实现细节)。
托管CSP只是将调用包装到非托管CAPI,因此当数据被编组时,您获得的只是实际数据的副本。