javaで署名認証について回目１

署名と認証の例（Java）                                          
                                          
1．必要なjarファイル：commons-codec-1.11.jar、bcprov-ext-jdk15on-158.jar                                          
                                          
2．署名について、サンプルソース                                          
                                          
  署名対象データ（「取引日時」(14バイト)、「端末識別番号」（13バイト）、「端末処理通番」（15バイト）を結合した文字列（42バイト））                                        
  String message = "20171201091011A004012345678012345678901234";                                        
                                          
  秘密鍵ファイルの読込                                        
  Security.addProvider(new BouncyCastleProvider());                                        
※署名と認証を一緒に行うとき、一回だけ実行でいい
  PemReader pemPriReader = new PemReader(new FileReader("./file/private-key.pem"));                                        
  PemObject objPri = pemPriReader.readPemObject();                                        
  byte[] privateKeyByte = objPri.getContent();                                        
                                          
  秘密鍵の対象を生成する                                        
  PKCS8EncodedKeySpec pkcs8 = new PKCS8EncodedKeySpec(privateKeyByte);                                        
  KeyFactory keyFactory = KeyFactory.getInstance("RSA");                                        
  RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8);                                        
                                          
  署名対象データと秘密鍵対象で、署名を行う                                        
  Signature signer = Signature.getInstance("SHA256withRSA");                                        
  signer.initSign(rsaPrivateKey);                                        
  signer.update(message.getBytes("UTF-8"));                                        
  byte[] signByte = signer.sign();                                        
                                          
  生成した署名バイトに基づいて、16進形式に変換する                                        
  Hex.encodeHexString(signByte);                                        
  ↓                                        
  7154172627db05f2eb6c8d0f522bd6d1ae0551899944e5a06170abd40e86d49a9204d29e1b251898fc47c633236168aafccf07d6458179f2cceb606dc4c84a3f7f9767fc4b00d3c43feabbc11ef750ca6d85bd7084e74b6c9bdd5bc2f497dae392b9f833a3e52133df74213770da74d9e2a9b08cbe2cf50d5bf1fbcdc00f4bab59ea885aeaaeb8e7a400491ba87c6121c4273a9daf723b89df0e6c4d62823a97db89e6eadea6800a0b692d6d4c19a343b0d762d4dcfd63ce7f41b291619ce2fda299533268d795188cb0cdfbd1a3f1e13f5399cfd52087396cf1a20361629495507569da9472602c985f3d90d35e4838cb9228a52ed211635faa55c94ba0dfbf                                        
                                          
3．認証について、サンプルソース                                          
                                          
  公開鍵ファイルの読込                                        
  PemReader pemPubReader = new PemReader(new FileReader("./file/public-key.pem"));                                        
  PemObject objPub = pemPubReader.readPemObject();                                        
  byte[] publicKeyByte = objPub.getContent();                                        
                                          
  公開鍵の対象を生成する                                        
  X509EncodedKeySpec x509 = new X509EncodedKeySpec(encodedByte);                                        
  KeyFactory keyFactory = KeyFactory.getInstance("RSA");                                        
  RSAPublicKey rsaPublicKey = (RSAPublicKey) keyFactory.generatePublic(x509);                                        
                                          
  公開鍵対象で、認証を行う                                        
  Signature verifier = Signature.getInstance("SHA256withRSA");                                        
  verifier.initVerify(rsaPublicKey);                                        
  verifier.update(message.getBytes("UTF-8"));                                        
  byte[] messageByte = Hex.decodeHex(上記で署名付き電文（16進形式）);                                        
  boolean result = verifier.verify(messageByte);