2014-02-15 50 views
0

我正在對由BigInteger值表示的文件實施數字簽名系統。 不幸的是,由於例外「Zero Length BigInteger」,空文件無法通過byte []轉換爲BigInteger。可能生成BigInteger值衝突?

所以我代表與空文件:

bigmesssage = new BigInteger ("0"); 

我關心的是現在:是否有任何文件值的衝突可能將被表示爲BigInteger的(「0」),當我讀文件「test1」就像下面的程序BigIntegerTest.java一樣!

計劃輸出產量文件「測試1」包含一個「0」:

0: 0 
test1: 12298 

非常感謝 格里特

import java.io.*; 
import java.math.BigInteger; 
import java.security.NoSuchAlgorithmException; 


public class BigIntegerTest { 



/** 
* @param args 
* @throws NoSuchAlgorithmException 
*/ 
public static void main(String[] args) throws NoSuchAlgorithmException { 
    // TODO Auto-generated method stub 

    byte[] message1; 
    BigInteger bigmessage1 = null; 
    BigInteger bigmessage2=new BigInteger ("0");   

    System.out.println("0: "+bigmessage2); 

    String filename="./bin/test1"; 

    message1 = To_Byte_Array(filename); 

    bigmessage1= new BigInteger (message1); 

    System.out.println("test1: "+ bigmessage1); 

} 

public static byte[] To_Byte_Array (String filename) throws java.security.NoSuchAlgorithmException { 
     //Liest die Nachricht, die in der Datei filename gespeichert ist, ein und 
     //speichert sie als byte-Array in message. 

     //lokale Variablen: 
     byte[] data = null; 
    // MessageDigest hash = MessageDigest.getInstance("SHA-512");//SHA2 //removed 

     //Streams, in: 
     File textFile;//Textdatei 
     FileInputStream in;//Dateieingabe-Stream 

     try { 

      textFile = new File(filename); 
      in = new FileInputStream(textFile); 
      int size = (int)textFile.length(); // Dateilaenge 
      int read = 0; // Anzahl der gelesenen Zeichen 
      data = new byte[size];  // Lesepuffer 
      // Auslesen der Datei 
      while (read < size) 
      read =+ in.read(data, read, size-read); 
      in.close(); 
      // Schreiben des Lesepuffers in Instanz von MessageDigest und speichern des Hash-Werts in message 
      //hash.update (data);//removed 
      //message=hash.digest();//removed 


     }//try 
     catch (IOException ex) { 
     ex.printStackTrace(); 
     } 
     return data;//added 
    }//To_Byte_Array 


} 
+0

是,一個字節的文件和 如可在與計算的BigInteger副作用下面的演示中可以看出值'0'。 –

+0

我嘗試了ASCII字符0的文件,它的值爲: 'test1:12298' 然後該文件有兩個字節。 – Leder

+0

是的,你是對的:一個字節^ @具有相同的BigInteger值。 你知道一種方式,如何將empy文件編碼爲唯一的BigInteger值? – Leder

回答

0

我發現沒有辦法產生的行爲就像所有其他的BigInteger值的唯一的BigInteger值。我在想一個獨特的價值通過哈希函數sha256sum作爲計算:

[email protected]:~/workspace1/gmr-digital-signature-2$ sha256sum test1 
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 test1 

test1的是空文件,以及:

[email protected]:~/workspace1/gmr-digital-signature-2$ echo -ne '' | sha256sum 
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 - 

與此相反的ASCII值^ @或\ X00:

[email protected]:~/workspace1/BigIntegerTest/bin$ echo -ne '\x00' | sha256sum 
6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d - 

因此我排除了我的系統中的空文件!

衝突本來是兩次使用值'0':空文件和echo -ne '\x00' > test1a

import java.io.*; 
import java.math.BigInteger; 
import java.security.NoSuchAlgorithmException; 


public class BigIntegerTest { 



/** 
* @param args 
* @throws NoSuchAlgorithmException 
*/ 
public static void main(String[] args) throws NoSuchAlgorithmException { 
    // TODO Auto-generated method stub 

    byte[] message3; 
    BigInteger bigmessage1 = null; 
    BigInteger bigmessage2 = null;  
    BigInteger bigmessage3 = null; 



    bigmessage1 = BigInteger.ZERO; 

    System.out.println("BigInteger.ZERO: "+bigmessage1); 

    System.out.println("null: "+bigmessage2); 

    String filename="./bin/test1a"; 

    message3 = To_Byte_Array(filename); 

    bigmessage3= new BigInteger (message3); 

    System.out.println("test1a: "+ bigmessage3); 

    String comp = null; 

    if (bigmessage1==bigmessage3) {comp="true";} else {comp="false";}; 

    System.out.println("bigmessage1==bigmessage3: " + comp); 

    if (BigInteger.ZERO==BigInteger.ZERO) {comp="true";} else {comp="false";}; 

    System.out.println("BigInteger.ZERO==BigInteger.ZERO: " + comp); 

} 

public static byte[] To_Byte_Array (String filename) throws java.security.NoSuchAlgorithmException { 
     //Liest die Nachricht, die in der Datei filename gespeichert ist, ein und 
     //speichert sie als byte-Array in message. 

     //lokale Variablen: 
     byte[] data = null; 
    // MessageDigest hash = MessageDigest.getInstance("SHA-512");//SHA2 //removed 

     //Streams, in: 
     File textFile;//Textdatei 
     FileInputStream in;//Dateieingabe-Stream 

     try { 

      textFile = new File(filename); 
      in = new FileInputStream(textFile); 
      int size = (int)textFile.length(); // Dateilaenge 
      int read = 0; // Anzahl der gelesenen Zeichen 
      data = new byte[size];  // Lesepuffer 
      // Auslesen der Datei 
      while (read < size) 
      read =+ in.read(data, read, size-read); 
      in.close(); 
      // Schreiben des Lesepuffers in Instanz von MessageDigest und speichern des Hash-Werts in message 
      //hash.update (data);//removed 
      //message=hash.digest();//removed 


     }//try 
     catch (IOException ex) { 
     ex.printStackTrace(); 
     } 
     return data;//added 
    }//To_Byte_Array 


} 

----------產生的輸出:

BigInteger.ZERO: 0 
null: null 
test1a: 0 
bigmessage1==bigmessage3: false 
BigInteger.ZERO==BigInteger.ZERO: true 
0

它應該能夠創建一個BigInteger不會是等於任何其他BigInteger

內部的BigInteger存儲一個int signum(表示數字的符號)和一個int[] mag,其中包含表示數字二進制值的字節。

但是,BigInteger.ZERO包含一個int[] mag = new int[0]和一個signum = 0(以確保在所有情況下均爲0 == 0)。如果您製作一個包含相同magsignum爲'1'的特殊zero,您將擁有一個不等於BigInteger.ZERO的唯一BigInteger,但在數學上的作用與BigInteger.ZERO完全相同。

這似乎創建一個BigInteger不等於零,但做它的數學似乎打亂BigInteger數學。

public void test() throws Exception { 
    BigInteger NAN = bigNAN(); 
    System.out.println("NAN==ZERO " + NAN.equals(BigInteger.ZERO)); 
    System.out.println("NAN+0 " + NAN.add(BigInteger.ZERO)); 
} 

public static BigInteger bigNAN() throws Exception { 
    BigInteger NAN = new BigInteger(new byte[]{0}); 
    Field hack = BigInteger.class.getDeclaredField("signum"); 
    hack.setAccessible(true); 
    hack.set(NAN, 1); 
    return NAN; 
} 

打印

NAN==ZERO false 
java.lang.ArrayIndexOutOfBoundsException: 0 
... 
+0

不幸的是我需要BigInteger數學表示空文件的數值.. 。現在我尋找一個使用空指針'null'的解決方案。 – Leder

0

使用常數BigInteger.ZERO,該不會是==任何其他 「零」 的實例。

然後可以使用==測試如果一個文件是空的:

if (bigmesssage == BigInteger.ZERO) 
    // the file is empty 
+0

「,它不會等於任何其他的」零「Insrance」在大整數中是不是隻有一個零表示? – kajacx

+0

@kajacx否 - 有許多「零」值:請參閱[本文](http://stackoverflow.com/questions/10950914/how-to-check-if-bigdecimal-variable-0-in-java/10950967 #10950967)。另外,其他實例可能是'equals()',但不會是'=='。 – Bohemian

+0

我需要'bigmessage'上的完整數學。或者我現在嘗試用空指針'null'來執行文件空測試... – Leder