2013-07-20 115 views
0

如何將大整數轉換爲java密碼庫的密鑰? 我正在嘗試使用我爲AES加密的密鑰值生成的共享diffie hellman密鑰。將BigInteger轉換爲密鑰

下面是我用

BigInteger bi; long value = 1000000000; 

BI = BigInteger.valueOf(值)的代碼; Key key = new Key(bi);

但是它沒有工作。 我可以知道如何將BigInteger值轉換爲Key值?

在此先感謝!

+0

這是家庭作業,是不是? – devnull

+0

'Key'是一個接口,你不能實例化它 – fge

回答

2

首先,你不能施放它。 BigInteger類和Key接口之間沒有關係。其次,Key是一個接口不是類,所以你不能創建它的實例。你需要創建的是一些實現Key的類的實例。它很可能需要成爲一個特定的實現類,而不是(比如說)一個匿名類。

最後一點是,Java加密API旨在隱藏密鑰的表示形式。要從字節創建密鑰,您需要創建一個KeySpec對象;例如SecretKeySpec(byte[] key, String algorithm)),然後使用KeyFactory從中「生成」一個密鑰。典型的KeySpec構造函數以byte[]作爲參數,因此您首先需要從BigInteger實例中獲取字節數組。

1

您需要將BigInteger轉換爲特定大小的字節數組,然後使用第一個(最左邊的)字節創建一個密鑰。爲此,您需要知道DH中使用的素數p的大小,因爲該值需要左填充以表示密鑰。我建議使用標準化的DH參數(或者至少確保素數的大小可以被8除)。

注意,有可能在使用BigInteger.toByteArray()因爲返回的值是檢索到的字節數組前面的零值字節編碼作爲簽署(二補數)大端字節數組。如果結果大於素數(以字節爲單位),則需要刪除該字節。

public static byte[] encodeSharedSecret(final BigInteger sharedSecret, final int primeSizeBits) { 

    // TODO assignment add additional tests on input 

    final int sharedSecretSize = (primeSizeBits + Byte.SIZE - 1)/Byte.SIZE; 

    final byte[] signedSharedSecretEncoding = sharedSecret.toByteArray(); 
    final int signedSharedSecretEncodingLength = signedSharedSecretEncoding.length; 

    if (signedSharedSecretEncodingLength == sharedSecretSize) { 
     return signedSharedSecretEncoding; 
    } 

    if (signedSharedSecretEncodingLength == sharedSecretSize + 1) { 
     final byte[] sharedSecretEncoding = new byte[sharedSecretSize]; 
     System.arraycopy(signedSharedSecretEncoding, 1, sharedSecretEncoding, 0, sharedSecretSize); 
     return sharedSecretEncoding; 
    } 

    if (signedSharedSecretEncodingLength < sharedSecretSize) { 
     final byte[] sharedSecretEncoding = new byte[sharedSecretSize]; 
     System.arraycopy(signedSharedSecretEncoding, 0, 
       sharedSecretEncoding, sharedSecretSize - signedSharedSecretEncodingLength, signedSharedSecretEncodingLength); 
     return sharedSecretEncoding; 
    } 

    throw new IllegalArgumentException("Shared secret is too big"); 
} 

之後,您需要使用某種密鑰導出方案導出密鑰字節。應使用一個依賴於要實現的標準:

RFC 2631

X9.42說明提供了用於產生一個基本上任意 量從ZZ密鑰材料的算法。我們的算法是通過強制使用某些可選字段並省略其他字段從而得到的。

KM = H (ZZ || OtherInfo) 

H是消息摘要函數SHA-1 [FIPS-180] ZZ是在第2.1.1節中計算出的共享 祕密值。前導零必須是
保留,以便ZZ佔用與p一樣多的八位組。

注意,我在充氣城堡庫發現一個bug高達1.49(這是在此日期當前版本)中關於祕密提取DH實現 - 它並剝離假龍頭00H值字節,但它忘記了將結果留給最大尺寸p。這將導致不正確的派生密鑰曾經在192倍(!)