2012-04-11 66 views
3

我有以下代碼:RSA和BigInteger的在Java中

BigInteger d = new BigInteger(1,NFCUtil.hexStringToByteArray(IssPrivKey)); 
BigInteger n = new BigInteger(1,NFCUtil.hexStringToByteArray(IssPubKeyMod)); 
BigInteger X = new BigInteger(1,NFCUtil.hexStringToByteArray(unsignedPhoneCert)); 

BigInteger iccCertBI = X.modPow(d, n); 

final String iccCert = iccCertBI.toString(16); 

System.out.println("\nSigned Certificate: (int)" + iccCertBI + 
      "\nSigned Certificate (hex): "+iccCert + 
      "\nsigned Cert length: "+iccCert.length()); 

我在做什麼是簽約使用專用指數和公共模數的字符串。所有長度都是288個字符或144個字節。在踢球的是,當我用它下面的字符串:

//Length 144 
    final String unsignedTerCert="6A04846983677983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF121" + 
      "3AFAFAF01018001BDB011D89730D7958DCAF0D34A4668A65073F2766BAC3C3E7D551211A" + 
      "1D7896085F1F4FDAA9A256579B0D4D6B1C7CF6C88D318886C55FB3CA91DB721376797058" + 
      "F482A51A363B92A89DA81BB6A7FFBB6F8C8E109E5909EFFFFFFFFFFFFFFFFFFFFFFFFFFF" + 
      "FFFFFFFFFFFFFBC"; 

它給我回長度288個字符或144個字節串,就如同我期待。

但是使用它:

//Length 144 
    final String unsignedPhoneCert="6A0400112233445566778899011401020301018001AE0A3CCBF6B1A997E4A4AEC7EDA6697F6B73C2EC18F8E3403F83237BD9863B4CD0BE0EBC2A8E3FB140251935F1D4EAEF2D7801FFC2CF36328E234676F96883BAB6547F82FE02455B59B6952231B130EE70980B74456168AD2A511A00448BFEA62593DCF9F3D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC"; 

給我回長度287個字符的字符串。

所以我的問題是,有什麼在BigInteger toString(16)方法導致這個?

注意:我仍然可以使用公鑰展示從BigInteger中解密它們,所以這就是我認爲這是與.toString()方法有關的事情。

任何幫助/提示將不勝感激,謝謝。

編輯:這是我從一個不正確獲取輸出:

Expo:36652731434641292350412815683229009979770975413220344544898857375896901092978000426765621805499026545042319009684553729382562239973283276192079521889464379604341193094271888918244826201023503324034315850394178807890994288745747556760470026279678747937975742329807945656583328292494373708777822442236249197245972251059241540578219194613740104635899 
X:25332900759103924912689760614898214526937827890939506310067994686010108648336498000719255096072122266248508522922053911850606613923138698430079380374971383359222723175609119386369637533489684435824557964231714784677160255389973258884831385632708921103814163273457386881057406862373463121304854072959526597286211022281774584184894225094204257730492 
X (hex):6a0400112233445566778899011401020301018001ae0a3ccbf6b1a997e4a4aec7eda6697f6b73c2ec18f8e3403f83237bd9863b4cd0be0ebc2a8e3fb140251935f1d4eaef2d7801ffc2cf36328e234676f96883bab6547f82fe02455b59b6952231b130ee70980b74456168ad2a511a00448bfea62593dcf9f3d9ffffffffffffffffffffffffffffffffffffffffbc 

    Phone Signed Certificate: (int)2621041784071301050954845366555843081386290833242762939438653553587304361236513516037765146640763105648748143029523335470875071401132351534501879861341081099809142476414060273707263492268408647346182500147665413648376803840594353667155297685676942776395991299461798048817170064783101287983256626056086159016336001344190438106860395808579588320414 
    Phone Signed Certificate (hex): af802ec9b412c2e223e28cd0e540255b18351d570e24690b1b441f6e084afb3a03a6a1a52ec4268d9dacf47385222011a977994c9dc521dc4ca82f20f4345ee8697a1cc269931211640efe7b6d29c728283aa823525887f09dbc6df37f3e1a6ec4718ccbb31778d813e4375d89631503dc785c9c9eb4770e918a3cc37c90b6d75135d8c32c299d8096d4bd88199ec9e 
    Phone signed Cert length: 287 

而從正確的:

Expo:36652731434641292350412815683229009979770975413220344544898857375896901092978000426765621805499026545042319009684553729382562239973283276192079521889464379604341193094271888918244826201023503324034315850394178807890994288745747556760470026279678747937975742329807945656583328292494373708777822442236249197245972251059241540578219194613740104635899 
X:25333383310317922886770001828148668452338535025796085964448660925847832365078972818630528414968514941209307982589233259227108935074767908506952878286644207041412726931112453402165128539381501316868062159358826581046954850027043009445846574678562969939333097216245548333577227051225788418683968135213089604118672442657593365304099582656739524214716 
X (hex):6a04846983677983ffffffffffffffffffffffffffffffffffffff1213afafaf01018001bdb011d89730d7958dcaf0d34a4668a65073f2766bac3c3e7d551211a1d7896085f1f4fdaa9a256579b0d4d6b1c7cf6c88d318886c55fb3ca91db721376797058f482a51a363b92a89da81bb6a7ffbb6f8c8e109e5909effffffffffffffffffffffffffffffffffffffffbc 

Phone Signed Certificate: (int)21432015836175396598983285831512248305709761145636099501338782160749145447638782142594889169355603470185237110648036474961995187557563452989823081731645192439732733979910407327875747461117018365485531108584396064685039171356192052384601156809092826847482291755881176360680132279291900385137689881779233791387498805975645418591098518000313085841654 
Phone Signed Certificate (hex): 59b0d96873fa0895d52d3f63475dd224c0a73bc34439e369a7b5eea88fd65b52464317b88642016421e9054d7e19dfc9cac7ffda07faea496268ea133cd83dc45959de61b1aa4b26a46ab47c6b8f4f2c092e914f0d940e9082b800119eba061bf7a654c022bc9c601a2d02a9775fb2cd23e532146443d7236c2ab301478fc9c59bbd984792d95d1db1a8d2ce80add0f6 
Phone signed Cert length: 288 

回答

5

BigInteger.toString(int)不會墊它的輸出與前導零。如果你想有一個固定寬度的輸出,嘗試String.format

String.format("%0288x", iccCertBI) 

地址

格式字符串分解如下:

  • %標示格式說明,一開始這告訴格式化程序在輸出中的這個位置放置相應的參數。
  • 0告訴格式化程序使用零填充;沒有這個,它使用空格填充。
  • 288告訴格式化輸出產生最低288一個字符(不知道你是否可以指定最大)
  • x告訴格式化爲相應的參數轉換爲十六進制整數(任意數字原始或類型,例如int,longBigInteger,將在此處起作用)。

String.format用於格式化通用的數據類型爲字符串的一個強大的工具,你一定要在Javadoc讀了。

+1

非常感謝,我認爲這可能是這樣的事情,但不知道如何確定。只是一個檢查,以確保%0288保證輸出長度爲288是嗎? – Peanut 2012-04-11 19:36:04

+2

@Pananut它保證最小輸出長度爲288 - 請參閱編輯。 – Alex 2012-04-11 19:53:53

+1

非常感謝Alex。 – Peanut 2012-04-11 21:22:36