encryption - BitShifting with BigIntegers in Java -
i implementing des encryption in java use of bigintegers.
i left shifting binary keys java bigintegers doing biginteger.leftshift(int n) method. key of n (kn) dependent on result of shift of kn-1. problem getting printing out results after each key generated , shifting not expected out put. key split in 2 cn , dn (left , right respectively).
i attempting this: "to left shift, move each bit 1 place left, except first bit, cycled end of block. "
it seems tack on o's on end depending on shift. not sure how go correcting this.
results:
c0: 11110101010100110011000011110
d0: 11110001111001100110101010100
c1: 111101010101001100110000111100
d1: 111100011110011001101010101000
c2: 11110101010100110011000011110000
d2: 11110001111001100110101010100000
c3: 1111010101010011001100001111000000
d3: 1111000111100110011010101010000000
c4: 111101010101001100110000111100000000
d4: 111100011110011001101010101000000000
c5: 11110101010100110011000011110000000000
d5: 11110001111001100110101010100000000000
c6: 1111010101010011001100001111000000000000
d6: 1111000111100110011010101010000000000000
c7: 111101010101001100110000111100000000000000
d7: 111100011110011001101010101000000000000000
c8: 1111010101010011001100001111000000000000000
d8: 1111000111100110011010101010000000000000000
c9: 111101010101001100110000111100000000000000000
d9: 111100011110011001101010101000000000000000000
c10: 11110101010100110011000011110000000000000000000
d10: 11110001111001100110101010100000000000000000000
c11: 1111010101010011001100001111000000000000000000000
d11: 1111000111100110011010101010000000000000000000000
c12: 111101010101001100110000111100000000000000000000000
d12: 111100011110011001101010101000000000000000000000000
c13: 11110101010100110011000011110000000000000000000000000
d13: 11110001111001100110101010100000000000000000000000000
c14: 1111010101010011001100001111000000000000000000000000000
d14: 1111000111100110011010101010000000000000000000000000000
c15: 11110101010100110011000011110000000000000000000000000000
d15: 11110001111001100110101010100000000000000000000000000000
biginteger implements infinite-precision integers, shifting left keep adding zeros left. need rotate:
private static biginteger rotateleft(biginteger bi) { biginteger ret = bi.shiftleft(1); if (ret.testbit(32)) { ret = ret.clearbit(32).setbit(0); } return ret; }
that's going rather inefficient 32-bit numbers, might use primitives rotate des' 28-bit halves. i'm not familiar des algorithm, i'll assume need biginteger else.
private static biginteger rotateleftprimitive(biginteger bi) { int value = bi.intvalue(); return biginteger.valueof(((value << 1) & 0xffffffe) | ((value >>> 27) & 1)); }
Comments
Post a Comment