1

にデジタル署名 ( byte[] signedBytes) がありbyte[] arrayます。これをBigInteger( ) に変換し、結果の数値を何かに使用してからbigSignedBytesに戻す必要があります。byte[] convertBackSignedBytesBigInteger

byte[] signedBytes = rsa.sign();
BigInteger bigSigned = new BigInteger(signedBytes);
convertBackSignedBytes = bigSigned.toByteArray();
//signedBytes and convertBackSignedBytes differ.

問題は、元の変数とは異なるように見えBigIntegerます。私は2の補数を返すことを知っています-これは責任がある可能性があります。byte[] convertBackSignedBytessignedBytesBigInteger.toByteArray()byte[] value

BigIntegerでは、2 の補数なしで元のバイトを取得するにはどうすればよいでしょうか。

誰かがこれを勧めました:

byte[] convertBackSignedBytes = bigIntegerValue.toByteArray();
if (convertBackSignedBytes[0] == 0) {
    byte[] tmp = new byte[convertBackSignedBytes.length - 1];
    System.arraycopy(convertBackSignedBytes, 1, tmp, 0, tmp.length);
    convertBackSignedBytes = tmp;
}   

試してみました - うまくいきませんでした。オリジナルとは異なる byte[]value を返しますsignedBytes

元の署名を検証しようとすると、成功します。

しかし、変換された署名を使用して検証しようとすると、失敗します。だからsignedBytesconvertBackSignedBytesはもはや同じではありません。

簡単な指針を教えてください。

4

2 に答える 2

1

2 の補数が実際に問題である場合 (確信はありません)、元のバイト配列の前に常に 0x00 バイトを追加することで解決できるはずです。これにより、常に正の数が得られます。

しかし、たとえば、これが問題になる可能性があります。元の配列が 0x00 または 0xFF バイトで始まる場合、それらの一部またはすべてが変換の過程で消失する可能性があります。

したがって、整数を転送する代わりに、単に「0102affe01dead07cafe89babe」のような文字列を転送してみませんか? バイトを 16 進文字列にエンコードして戻すのは簡単です。

絶対に大きな整数を使用する必要がある場合は、エンコードの前に 0x01 を追加し (これでも正の数が得られます)、デコード後に削除してください。

于 2013-02-23T21:25:14.997 に答える
0

長さが異なるため、逆変換が失敗する可能性があります。

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class So15045472 {
    static void print(byte[] bytes) {
        List<Byte> bs=new ArrayList<Byte>(bytes.length);
        for(byte b:bytes)
            bs.add(b);
        System.out.println(bs);
    }
    static boolean compare(byte[] x,byte[] y) {
        if(x.length!=y.length) {
            System.out.println("unequal lengths");
            return false;
        }
        for(int i=0;i<x.length;i++)
            if(x[i]!=y[i])
                return false;
        return true;
    }
    static void check(byte[] bytes) {
        BigInteger x=new BigInteger(bytes);
        System.out.println(x);
        byte[] b=x.toByteArray();
        print(bytes);
        print(b);
        boolean isEqual=compare(bytes,b);
        if(!isEqual)
            System.out.println("compare says "+isEqual);
        else System.out.println("ok");
    }
    public static void main(String[] args) {
        byte[] b1=new byte[]{(byte)0x00,(byte)0xff};
        check(b1);
        byte[] b2=new byte[]{(byte)0xff,(byte)0xff};
        check(b2);
    }
}
于 2013-02-23T21:37:19.770 に答える