Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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
Java中使用大整数的位移位_Java_Encryption_Key_Biginteger_Des - Fatal编程技术网

Java中使用大整数的位移位

Java中使用大整数的位移位,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

我使用大整数在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:11110101010100110011000011110000000000000000000000


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));
}