Java中使用大整数的位移位
我使用大整数在Java中实现DES加密 通过使用biginger.leftShift(intn)方法,我使用Java BigInteger左移位二进制键。N(Kn)的键取决于Kn-1移位的结果。我遇到的问题是,在生成每个关键帧后,我打印出结果,而移位不是预期的输出。密钥分为两个Cn和Dn(分别为左侧和右侧) 我特别尝试这样做: 要进行左移位,请将每个位向左移动一处,第一位除外,它循环到块的末尾 根据班次的不同,它似乎会在末尾加上O。不知道该如何着手纠正这个问题 结果: c0:11110101010100110011000011110 d0:11110001111001100110101010100 c1:111101010101001100110000111100 d1:111100011110011001101010101000 c2:11110101010100110011000011110000 d2:11110001111001100110101010100000 c3:1111010101010011001100001111000000 d3:1111000111100110011010101010000000 c4:111101010101001100110000111100000000 d4:11110001111001100110101010100000000 c5:11110101010100110011000011110000000000 d5:1111000111100110011010101010000000000 c6:1111010101010011001100111000000000000 d6:111100011110011001101010101000000000000 c7:11110101010100110011000111000000000000 d7:1111000111100110011010101010000000000000 c8:1111010101010011001100001111000000000000000 d8:11110001111001100110101010100000000000000 c9:111101010101001100110000111100000000000000000 d9:111100011111001101010101000000000000000000 c10:11110101010100110011000011110000000000000000000 d10:111100011110011001101010101000000000000000000 c11:1111010101010011001100001111000000000000000 d11:111100011110011001101010101000000000000000000000 c12:111101010101001100110000111100000000000000000000000 d12:1111000111100110011010101010000000000000000000000000000000000000000 c13:11110101010100110011000011110000000000000000000000000 d13:111100011110011001101010101000000000000000000 c14:1111010101010011001100001111000000000000000000000 d14:11110001111001100110101010100000000000000000000000000000000 c15:11110101010100110011000011110000000000000000000000Java中使用大整数的位移位,java,encryption,key,biginteger,des,Java,Encryption,Key,Biginteger,Des,我使用大整数在Java中实现DES加密 通过使用biginger.leftShift(intn)方法,我使用Java BigInteger左移位二进制键。N(Kn)的键取决于Kn-1移位的结果。我遇到的问题是,在生成每个关键帧后,我打印出结果,而移位不是预期的输出。密钥分为两个Cn和Dn(分别为左侧和右侧) 我特别尝试这样做: 要进行左移位,请将每个位向左移动一处,第一位除外,它循环到块的末尾 根据班次的不同,它似乎会在末尾加上O。不知道该如何着手纠正这个问题 结果: c0:1111010101
d15:1111000111100110011010101010000000000000000000000000000000000000000似乎您需要循环左移。它不是循环的。您必须组合
shiftLeft
、shiftRight
、和以及或,就像您使用int
和biginger实现无限精度整数一样,因此向左移动将继续在左侧添加零。您需要旋转:
private static BigInteger rotateLeft(BigInteger bi) {
BigInteger ret = bi.shiftLeft(1);
if (ret.testBit(32)) {
ret = ret.clearBit(32).setBit(0);
}
return ret;
}
对于32位数字来说,这将是相当低效的,所以您可以只使用原语来旋转DES的28位的一半。我不熟悉DES算法,所以我假设您需要BigInteger来实现其他功能
private static BigInteger rotateLeftPrimitive(BigInteger bi) {
int value = bi.intValue();
return BigInteger.valueOf(((value << 1) & 0xffffffe) | ((value >>> 27) & 1));
}
私有静态BigInteger rotateLeftPrimitive(BigInteger bi){
int value=bi.intValue();
返回biginger.valueOf((value>>27)和1));
}
解决更大的问题1)DES已损坏,不应用于除使用遗留系统以外的任何其他用途,2)Sun JCE已经提供了一个实现(BouncyCastle和其他加密提供商也是如此),3)实现任何加密算法都是一项挑战,您确实希望使用经过良好测试的实现进行生产使用
如果是类练习,我会使用byte[]而不是BigInteger。您需要手工完成更多的工作,但它更接近DES的精神,因为它被设计为易于在硬件中实现。我认为您使用位字符串实现DES的想法作为一种教育工具是合理的。我建议您不要直接使用bigInteger来表示这些位字符串,而是创建一个位字符串类,该类正好实现项目所需的位字符串方法。在BitString类中,您可以使用BigInteger,但您可能会发现,每个数组元素具有1位的简单整数数组同样容易或更容易,或者可能是一个链表。不,这不起作用,因为他发布的原因:无限精度BigInteger将继续在右侧添加0。您的算法需要and(BigInteger.valueOf(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF始终返回1,这肯定不是有意的。抱歉,但这次是向下投票。修复允许用户通过L,我将删除。@bkail:我承认我不理解应用程序(DES?)但这正是我想要的。我现在意识到OP需要一个固定的周期窗口,所以我在我的回答中澄清了这一点。感谢反馈。删除了否决票。我相信他实现了这一点:这不是有限的精度吗?如果bi
有100位呢?是的,这是有限的精度。但是,c0是29位,c1是5是56,所以我假设用户希望精度低于64。检查Wiki中的DES算法,我看到该算法中28位的一半是旋转的,所以我更新了我的答案。谢谢。
private static BigInteger rotateLeft(BigInteger bi) {
BigInteger ret = bi.shiftLeft(1);
if (ret.testBit(32)) {
ret = ret.clearBit(32).setBit(0);
}
return ret;
}
private static BigInteger rotateLeftPrimitive(BigInteger bi) {
int value = bi.intValue();
return BigInteger.valueOf(((value << 1) & 0xffffffe) | ((value >>> 27) & 1));
}