我需要为服务器创建加密密码。此服务器使用Blowfish加密进行加密。现在这里是我的信息:
我要加密的数据是“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]的字节?
我真的希望你们中的一些人可以帮助我的大脑开始朝着正确的方向前进。 感谢。
答案 0 :(得分:0)
Block size是Block密码一次处理的数据量。例如,如果加密算法的块大小为128位,则ASCII为16个字符。
要使用块大小,您需要将“明文”(尚未加密的文本)分段为64位块(在您的情况下)。然后通过加密循环每个块,并连接输出。 (如果您正在实施ECB加密,则不建议这样做。
正如我上面所说,你需要把你的文字分成块。最后一个块可能在必要的块大小之下,并且需要padding。
希望这能让你走上正确的路线:)。
答案 1 :(得分: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方法直接从Blowfish类复制,该类是加密和解密时在纯文本上使用的。请注意,在字符串的CBC模式下,IV(初始化向量)被复制到字符串的前面,因此前8个字节是IV。在这个代码的示例运行中,这是我得到的。
cipherText是ascii hex表示中的“2866ccafa647d82e7c74e135dbdcb9060cefea39b9b84964” 除了字节[24]之外,myByteArray是相同的。
我希望这能帮助人们好运!