C# 用C语言中的Bouncy Castle在CCM中加密AES密码#

C# 用C语言中的Bouncy Castle在CCM中加密AES密码#,c#,encryption,aes,bouncycastle,C#,Encryption,Aes,Bouncycastle,我想使用Bouncy Castle使用AES/CCM加密,我不知道我在以下代码中做错了什么(密钥和iv是从它们的HEXA表示中获得的): 执行上述代码会导致以下异常: Unhandled Exception: System.ArgumentException: Destination array was not long enough. Check destIndex and length, and the array's lower bounds. at System.Array.Cop

我想使用Bouncy Castle使用AES/CCM加密,我不知道我在以下代码中做错了什么(密钥和iv是从它们的HEXA表示中获得的):

执行上述代码会导致以下异常:

Unhandled Exception: System.ArgumentException: Destination array was not long enough. 
Check destIndex and length, and the array's lower bounds.
  at System.Array.Copy(Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length, Boolean reliable)
  at Org.BouncyCastle.Crypto.Modes.CcmBlockCipher.ProcessPacket(Byte[] input, Int32 inOff, Int32 inLen)
  at Org.BouncyCastle.Crypto.Modes.CcmBlockCipher.DoFinal(Byte[] outBytes, Int32 outOff)
  at Crypto.Tests.MainClass.Main(String[] args) in c:\Users\Emi\Documents\Projects\Crypto\Crypto.Tests\Main.cs:line 23

我不相信这些台词会像你想象的那样

var key = "D44EDA90DDCFA90216BDAC1559D704D336D371A3DA943E935315964D27CC91DC".ToByteArray(); 
var iv = "7B13E1A17861356401A3C15F4F0525C3".ToByteArray(); 
你可能想要的是

var key =
{
    0xD4, 0x4E, 0xDA, 0x90, 0xDD, 0xCF, 0xA9, 0x02,
    0x16, 0xBD, 0xAC, 0x55, 0x9D, 0x70, 0x4D, 0x33,
    0x6D, 0x37, 0x1A, 0x3D, 0xA9, 0x43, 0xE9, 0x35,
    0x31, 0x59, 0x64, 0xD2, 0x7C, 0xC9, 0x1D. 0x0C
}; 

var iv =
{
    0x7B, 0x13, 0xE1, 0xA1, 0x78, 0x61, 0x35, 0x64,
    0x01, 0xA3, 0xC1, 0x5F, 0x4F, 0x05, 0x25, 0xC3
}; 

另外,您的密钥长度无效(我在末尾添加了0和C)。

我不相信这些行会像您认为的那样

var key = "D44EDA90DDCFA90216BDAC1559D704D336D371A3DA943E935315964D27CC91DC".ToByteArray(); 
var iv = "7B13E1A17861356401A3C15F4F0525C3".ToByteArray(); 
你可能想要的是

var key =
{
    0xD4, 0x4E, 0xDA, 0x90, 0xDD, 0xCF, 0xA9, 0x02,
    0x16, 0xBD, 0xAC, 0x55, 0x9D, 0x70, 0x4D, 0x33,
    0x6D, 0x37, 0x1A, 0x3D, 0xA9, 0x43, 0xE9, 0x35,
    0x31, 0x59, 0x64, 0xD2, 0x7C, 0xC9, 0x1D. 0x0C
}; 

var iv =
{
    0x7B, 0x13, 0xE1, 0xA1, 0x78, 0x61, 0x35, 0x64,
    0x01, 0xA3, 0xC1, 0x5F, 0x4F, 0x05, 0x25, 0xC3
}; 

另外,您的密钥的长度无效(我在末尾添加了0个C)。

当它试图从您的nonce生成计数器IV时,它在bouncy castle中崩溃,因为它期望的nonce是(BlockSize-1)或更小,例如递增数。如果从iv中删除一个字节,它就会工作

   var iv = "7B13E1A17861356401A3C15F4F0525".ToByteArray();

当它试图从你的nonce生成一个计数器IV时,它在bouncy castle中崩溃了,因为它期望的nonce是(BlockSize-1)或更小,比如一个递增的数字。如果从iv中删除一个字节,它就会工作

   var iv = "7B13E1A17861356401A3C15F4F0525".ToByteArray();

密钥是使用PBKDF2获得的,但是为了简化示例,我将密钥转换为一个字符串,该字符串表示密钥字节数组中每个字节的十六进制字符串的串联。ToByteArray()扩展方法反转该过程。密钥长度没有问题您跳过了一个1,其中有0x55。密钥是使用PBKDF2获得的,但是为了简单起见,我将密钥转换为一个字符串,该字符串表示密钥字节数组中每个字节的十六进制字符串的串联。ToByteArray()扩展方法反转该过程。如果我没有弄错的话,密钥长度是可以的,您跳过了一个1,其中您有0x55CCM,这是很棘手的,因为IV大小取决于数据大小。GCM更容易使用。如果我没有弄错的话,CCM在IV大小取决于数据大小的意义上是很棘手的。GCM更易于使用。