2012-11-06 57 views
0

我試圖用大整數在Java中實現RSA加密,顯然模數是從q,p素數中隨機生成的,每個128字節-1024位。在RSA實現中處理BigIntegers

我的問題是,有時模出來257個字節,其中它的第一字節爲0,第二個總是以1(1 * * )開始(星=無論0 \ 1)。其他次這是一個積極的256個字節,其中第一個字節爲0

當我發送給modPow係數和指數我得到的開始:

java.lang.ArithmeticException: BigInteger: modulus not positive

即使我試圖刪除第一個0字節保持與其他256人我得到了問題。

一些代碼示例:

BigInteger p = new BigInteger(1024,20,new Random()); 
BigInteger q = new BigInteger(1024,20,new Random()); 
//multiplying p & q and inserting it to modulus 
ByteArray modulus = new ByteArray(p.multiply(q).toByteArray()); 
if (modulus.length()==257) 
{ 
    //if the first byte is 00 then erasing it 
    flag =false; 
    ByteArray temp = new ByteArray(TypeUtils.subArray(modulus.getByteArray(), 1, 256)); 
    modulus = temp; 
} 

BigInteger modulusInBig = new BigInteger(TypeUtils.Byte2byte(modulus.getByteArray())); 
BigInteger answer = inTextInBig.modPow(exponentInBig, modulusInBig); 
+4

不要擺脫最初的0字節,它屬於那裏。 BigInteger的Java字節編碼與稱爲DER編碼的方案兼容。如果正BigInteger的高位字節大於等於128,那麼正確的編碼是以00字節爲結果的前綴。 –

回答

1

java.math.BigInteger總是使用一個符號位在其toByteArray()方法及其BigInteger(byte[])構造。所以第一個字節的最重要的位表示符號。如果您有256 * 8位的無符號數據,並且該數據中最重要的位是1,那麼您必須有一個額外的0字節來表示數字是無符號的。刪除該字節將導致它被解釋爲一個負數,結果如上所述。