0

我需要为服务器创建一个加密密码。此服务器使用 Blowfish 加密进行加密。现在这里是我的信息:

  1. 密钥:“12345678abcdefgmypassword”
  2. 块大小:8 字节 - 64 位
  3. 结束字节:字节[24]

我要加密的数据是“ABCDEFG12345678”。

我遇到的问题是获得最大只有 24 个字节的加密,而我每次得到 48 个字节。我认为我最大的问题是因为我无法理解应该发生的事情!

这是我的一些代码:

>  BlowFish b = new BlowFish("12345678abcdefgmypassword");
>  Here I get the key array of byte[12]
>  plainText = "0123456789ABCDEF";
>  cipherText = b.Encrypt_CBC(plainText);
>  var encodedString = System.Text.Encoding.ASCII;
>  byte[] myByteArray = encodedString.GetBytes(cipherText);

现在我的问题是: 1. 块大小是多少?我该如何使用它?2. 如何获得低于或等于 byte[24] 的字节数?

我真的希望你们中的一些人可以帮助我的大脑开始朝着正确的方向前进。谢谢。

4

2 回答 2

0

您可以在这里查看源代码http://www.schneier.com/code/blowfish.cs它可以帮助您更好地理解它是如何工作的。还有一本关于密码学的优秀书籍,解释了这些算法如何工作的细节,是由 schneier 应用的密码学,在这里可以找到http://www.amazon.com/gp/aw/d/0471117099/

编辑:

好吧,我有时间玩这个,我想我知道你遇到的问题是什么。您最终得到 48 个字节的数据而不是 24 个字节的原因是因为您试图操纵 48 个字节长的密文的字符串表示,以便以 ASCII 显示整个密文。您需要做的就是将 ascii 字符串表示形式转换为字节数组。问题是(您在正确的轨道上)您必须以与 encrypt 方法相同的方式执行此操作。这是执行此操作的代码:

class Program
{
    private static byte[] HexToByte(string hex)
    {
        byte[] r = new byte[hex.Length / 2];
        for (int i = 0; i < hex.Length - 1; i += 2)
        {
            byte a = GetHex(hex[i]);
            byte b = GetHex(hex[i + 1]);
            r[i / 2] = (byte)(a * 16 + b);
        }
        return r;
    }



    private static byte GetHex(char x)
    {
        if (x <= '9' && x >= '0')
        {
            return (byte)(x - '0');
        }
        else if (x <= 'z' && x >= 'a')
        {
            return (byte)(x - 'a' + 10);
        }
        else if (x <= 'Z' && x >= 'A')
        {
            return (byte)(x - 'A' + 10);
        }
        return 0;
    }

    static void Main(string[] args)
    {
        BlowFish b = new BlowFish("12345678abcdefgmypassword");
        string plainText = "ABCDEFG12345678";
        string cipherText = b.Encrypt_CBC(plainText);
        MessageBox.Show(cipherText);
        plainText = b.Decrypt_CBC(cipherText);
        byte[] myByteArray = HexToByte(cipherText);
        MessageBox.Show(plainText);

    }
}

HexToByte 和 GetHex 方法直接从 Blowfish 类复制而来,该类在加密和解密时用于明文。请注意,在字符串的 CBC 模式下,IV(初始化向量)被复制到字符串的前面,因此前 8 个字节是 IV。在此代码的示例运行中,这是我得到的。

cipherText 在 ascii 十六进制表示中是“2866ccafa647d82e7c74e135dbdcb9060cefea39b9b84964”,myByteArray 是相同的,除了它的字节 [24]。

我希望这可以帮助男人好运!

于 2013-02-25T20:34:44.820 回答
0

块大小是块密码一次处理的数据量。例如,如果加密算法的块大小为 128 位,那么在 ASCII 中将是 16 个字符。

要使用块大小,您需要将“纯文本”(尚未加密的文本)分段为 64 位块(在您的情况下)。然后通过加密循环每个块,并连接输出。(如果您正在实施ECB加密,则不建议这样做)。

正如我上面所说,您需要将文本分成块。最后一个块可能小于必要的块大小,并且需要padding

希望这能让你走上正确的道路:)

于 2013-02-25T19:07:36.380 回答