2013-02-25 115 views
0

我需要为服务器创建一个加密密码。此服务器使用Blowfish加密来执行加密。现在,这里是信息我有:用字节[24]长度的BLOWFISH创建加密密码

  1. KEY: “12345678abcdefgmypassword”
  2. 块大小:8个字节 - 64位
  3. END BYTES:字节[24]

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

我遇到的问题是得到只有24个字节的加密,每次我得到48个。 我认为我最大的问题是因为我无法将自己的头围绕在应该发生的事情上!

下面是我的一些代码:

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

现在的问题,我有: 1.什么是块的大小?我该如何使用它? 2.如何得到低于或等于字节[24]的字节?

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

+0

你实际上是指blowfish加密还是bcrypt哈希? – CodesInChaos 2013-02-25 19:05:28

+0

我怀疑你搞砸了编码的地方。 – CodesInChaos 2013-02-25 19:06:56

+0

在密文上使用ASCII不可能是正确的。如果'Encrypt_CBC'返回一个十六进制字符串,则需要对其应用十六进制解码。 – CodesInChaos 2013-02-25 19:07:56

回答

0

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

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

正如我上面所说的,你需要把你的文本分块。最后的块可能在必要的块大小下,并且需要padding

希望这让你在右边线:)

+0

一些代码将如何查看? > Blowfish b =新Blowfish(hexkey)。 如何从“12345678abcdefgmypassword”获取十六进制密钥? – 2013-02-25 20:33:32

0

你可能有一个看看源代码在这里http://www.schneier.com/code/blowfish.cs它可以帮助你更好地理解它是如何工作的。同样在密码学的优秀图书这就解释了如何将这些算法的工作是由Schneier的应用密码学的细节在这里http://www.amazon.com/gp/aw/d/0471117099/发现

编辑:

好吧,我有时间玩这个,我想我知道是什么你遇到的问题是。原因是48字节数据而不是24字节是因为您试图操作字节长度为48个字节的字符串表示形式,以便以ASCII格式显示整个密文。所有你需要做的就是把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); 

    } 
} 

的HexToByte和GetHex方法是直接从河豚类是什么是加密和解密时的明文使用复制。请注意,在字符串的CBC模式下,IV(初始化向量)被复制到字符串的前面,所以前8个字节是IV。在这个代码的示例运行这里是我得到的。

密文是ASCII十六进制represenation “2866ccafa647d82e7c74e135dbdcb9060cefea39b9b84964” myByteArray是相同除了其在字节[24]。

我希望这有助于男人的好运!

+0

我目前使用河豚类,但我不知道在代码中使用什么。我觉得我必须从我的密码字符串创建一个十六进制字符串才能输入代码。但那部分没有了我! – 2013-02-25 20:40:09

+0

@Phillip Kemp从我在课上看到的字符串的用法很好。这就是你之后对密文进行的处理,这很可能是问题所在。你如何将这些数据发送到服务器?我不清楚你到底想要做什么? – ValueforValue 2013-02-25 20:56:59

相关问题