Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用字节[24]长度的BLOWFISH创建加密密码_C#_Encryption_Byte_Blowfish - Fatal编程技术网

C# 使用字节[24]长度的BLOWFISH创建加密密码

C# 使用字节[24]长度的BLOWFISH创建加密密码,c#,encryption,byte,blowfish,C#,Encryption,Byte,Blowfish,我需要为服务器创建加密密码。此服务器使用Blowfish加密来执行加密。以下是我掌握的信息: 关键字:“12345678 ABCDEFGMYPASSWORD” 块大小:8字节-64位 结束字节:字节[24] 我要加密的数据是“ABCDEFG12345678” 我遇到的问题是要得到最多只有24字节的加密,而我每次只能得到48字节。 我想我最大的问题是因为我不能对应该发生的事情保持清醒的头脑 以下是我的一些代码: > BlowFish b = new BlowFish("12345678ab

我需要为服务器创建加密密码。此服务器使用Blowfish加密来执行加密。以下是我掌握的信息:

  • 关键字:“12345678 ABCDEFGMYPASSWORD”
  • 块大小:8字节-64位
  • 结束字节:字节[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.如何获得小于或等于字节[24]的字节

    我真的希望你们中的一些人能帮助我的大脑开始走上正确的方向。 谢谢。

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

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

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


    希望这能让您的思路正确:)

    您可以看看这里的源代码,它可能会帮助您更好地理解这是如何工作的。schneier在这里还发现了一本关于密码学的优秀书籍,它解释了这些算法如何工作的细节

    编辑:

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

    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);
    
        }
    }
    
    类程序
    {
    专用静态字节[]十六进制字节(字符串十六进制)
    {
    字节[]r=新字节[hex.Length/2];
    对于(int i=0;i
    HexToByte和GetHex方法直接从Blowfish类复制,Blowfish类在加密和解密时用于明文。请注意,在CBC模式下,字符串上的IV(初始化向量)被复制到字符串的前面,因此前8个字节是IV。在这段代码的示例运行中,这里是我得到的

    密文是ascii十六进制表示的“2866ccafa647d82e7c74e135dbdcb9060cefea39b9b84964” myByteArray除了在字节[24]中之外,其他都是相同的


    我希望这有助于男人好运

    你是说河豚加密,还是bcrypt哈希?我怀疑你把编码搞砸了。在密文上使用ASCII码是不对的。如果
    Encrypt\u CBC
    返回十六进制字符串,则需要对其应用十六进制解码。部分代码看起来如何?>河豚b=新的河豚(hexkey)。如何从“12345678abcdefgmypassword”中获取十六进制键?我目前正在使用blowfish类,但不确定在代码中的何处使用什么。在我看来,我必须从我的密码字符串中创建一个十六进制字符串来输入代码。但那部分我想不通@Phillip Kemp从我在课堂上看到的情况来看,字符串的使用很好。最有可能的问题是你在事后如何处理密文。如何将此数据发送到服务器?我不清楚你到底想做什么?