首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中用弹跳城堡实现密码学加密

在C#中用弹跳城堡实现密码学加密
EN

Stack Overflow用户
提问于 2012-08-20 20:40:14
回答 2查看 3K关注 0票数 2

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

代码语言:javascript
复制
using System;
using System.Linq;
using System.Text;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Modes;
using Org.BouncyCastle.Crypto.Parameters;

namespace Crypto.Tests {
    class MainClass {
        public static void Main (string[] args) {
            var key = "D44EDA90DDCFA90216BDAC1559D704D336D371A3DA943E935315964D27CC91DC".ToByteArray();
            var iv = "7B13E1A17861356401A3C15F4F0525C3".ToByteArray();
            var nonSecretPayload = new byte[] { };
            var plainText = Encoding.UTF8.GetBytes("Secret message!!!");

            var cipher = new CcmBlockCipher(new AesFastEngine());
            var parameters = new CcmParameters(
                new KeyParameter(key), 64, iv, nonSecretPayload);
            cipher.Init(true, parameters);

            var cipherText = new byte[cipher.GetOutputSize(plainText.Length)];
            var len = cipher.ProcessBytes(plainText, 0, plainText.Length, cipherText, 0);
            cipher.DoFinal(cipherText, len);

            Console.WriteLine(Convert.ToBase64String(cipherText));

            Console.Read();
        }
    }

    public static class StringExtentions {
        public static byte[] ToByteArray(this string toTransform) {
            return Enumerable
                .Range(0, toTransform.Length / 2)
                .Select(i => Convert.ToByte(toTransform.Substring(i * 2, 2), 16))
                .ToArray();
        }
    }
}

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

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-20 21:32:51

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

代码语言:javascript
复制
   var iv = "7B13E1A17861356401A3C15F4F0525".ToByteArray();
票数 1
EN

Stack Overflow用户

发布于 2012-08-20 21:04:12

我不相信这些行做的是你想的那样,

代码语言:javascript
复制
var key = "D44EDA90DDCFA90216BDAC1559D704D336D371A3DA943E935315964D27CC91DC".ToByteArray(); 
var iv = "7B13E1A17861356401A3C15F4F0525C3".ToByteArray(); 

你可能想要的东西更像是,

代码语言:javascript
复制
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)。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12037843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档