我需要加密ISO 8583消息......这里的问题是消息比密钥长。我需要一些帮助我如何加密这个字符串。
例如:我的字符串中有300个字符;我应该单独加密每个16个字符然后连接它们,因为我的主密钥长度是16个字节?
感谢您的帮助......
ISO 8583-1:2003金融交易卡发起的消息 - 交换消息规范 - 第1部分:消息,数据元素和代码值。
答案 0 :(得分:7)
DES是一种分组密码,分组密码具有不同的操作模式。
您提到的模式称为ECB(电子密码本),并且不是很安全(实际上,DES也不是,但稍后会更多)。
我建议您使用CBC或其他模式。
您可以在此处阅读有关分组密码的操作模式:Block cipher modes of operation
至于密码本身,我建议你尽量避免使用DES。 DES现在非常容易破解。如果AES不可用,请使用AES或至少3DES。
编辑:为了回应updated question,是的,如果明文大小不是块大小的倍数,则需要填充最后一个块。
答案 1 :(得分:4)
分组密码有许多不同的操作模式。
如果您只需要将ECB应用于纯文本,只需将纯文本拆分为大小相等的8字节块(DES块大小)并分别加密。
根据您想要实现的目标,您也可以使用
还有更多模式,但这些是最常用的模式(imho) 正如其他人指出的那样,访问Wikipedia了解所有细节。
<强>更新强>
至于填充,您有不同的possibilities。我建议使用ANSI X.923标准,它基本上要求你用零填充最后一个缓冲区,并在最后一个字节中附加一个计数器,它给你最后一个块中的有效字节数。 ISO10126中使用了相同的思想,但这次填充是用随机字节完成的。
请注意,使用CTS时可以完全避免填充。
也许问问自己,使用加密库来实现这项工作实际上是否更容易 如果您正在使用C ++,请转到Crypto++(不是那么简单,但一致的c ++风格),Java和.NET内置了加密提供程序。如果你想使用普通C,我可以推荐libTomCrypt(非常好用)。
答案 2 :(得分:2)
密钥长度不会对邮件大小施加限制。消息可以是您想要的长度,您的128位密钥(非标准的DES?)仍然是好的。 DES cipher对字节块进行操作,一次一个块。 Standard DES使用56位密钥(加上8个奇偶校验位)和64位块。
我应该单独加密每个16个字符 然后连接他们,因为我的主密钥 长度是16个字节?
密码通常不要求密钥和块大小相同;他们可以定义复杂的操作,使用给定的明文块,并用密钥将其转换为密文块(通常具有相同的大小)。当需要加密多个块时,指定mode of operation来描述一个块如何与进程中的下一个块相关。
在电子密码本(ECB)模式下操作时,消息被分成块,每个明文块用相同的密钥分别加密(然后连接生成的密文块) 。像其他modes of operation for DES(即CBC,CFB,OFB)一样,这种方法有其优点和缺点。您需要选择最适合您应用的模式。
不过,您还应该知道DES现在是considered insecure。答案 3 :(得分:2)
您需要查找encryption modes - 其中包含密码块链接(CBC)和“不使用”模式电子代码簿(ECB)等名称,甚至还有一些外来名称,如Infinite Garble Extension (IGE)。该页面清楚地说明了为什么不应该使用ECB模式。
CBC是一种标准的,稳固的运作模式。 OFB和CFB也被广泛使用。
您意识到美国联邦政府不再使用普通DES,因为它不够安全(因为它使用的是56位密钥并且可以通过暴力破解)?三重DES几乎是可以容忍的 - 它有一个112位或168位密钥,具体取决于您使用它的方式。不过,标准是高级加密系统AES。除非出于向后兼容性原因,否则应在新的生产代码中使用AES而不是DES。
此外,在尝试编写生产代码之前,您应该知道这些问题的答案。我相信这是家庭作业或个人兴趣的本质。
答案 4 :(得分:2)
您可能希望加密,原因如下:
还有一件事,你的主密钥应该是128位,以符合Visa的要求(Triple DES授权LMK至少有双倍密钥,32位 - 128位密钥)