JAVA暗号化アルゴリズム(5)-デジタル署名アルゴリズム(RSA、DSA)

2526 ワード

デジタル署名プロセス
(1)署名の生成:ソースファイルの「デジタル要約」に対して、秘密鍵で暗号化し、「暗号化デジタル要約」を生成する.
(2)検証署名:「暗号化デジタル要約」を公開鍵で復号し、「デジタル要約2」を生成し、「デジタル要約」と「デジタル要約2」を比較し、結果が同じであれば署名検証に合格する.
概念:「公開鍵」と「秘密鍵」を持つ「メッセージ要約」アルゴリズムは、「非対称暗号化アルゴリズム」と「メッセージ要約」アルゴリズムの結合体である
秘密鍵署名、公開鍵検証
一般的な署名アルゴリズム
  • RSASignature
  • DSASignature
  • ECDSASignature(Bouncy Castleが必要)
  • デジタル署名の役割
  • データ整合性の検証
  • 認証データソース
  • 抗否定
  • シーン
    Android App開発者の署名など
    RSASignatureの例
    import java.security.*;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    
    public class RSASignatureUtil {
    
        public static final String KEY_ALGORITHM = "RSA";//    
        public static final String SIGN_ALGORITHM = "MD5withRSA";//    :MD2withRSA,SHA1WithRSA,SHA256withRSA,SHA384withRSA,SHA512withRSA
    
        /**
         *    RSA    
         */
        public static KeyPair initKey() throws Exception{
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM);
            keyPairGenerator.initialize(1024);
            return keyPairGenerator.generateKeyPair();
        }
    
        /**
         *   (   ,   2  )
         */
        public static byte[] sign(byte[] data, PrivateKey privateKey) throws Exception{
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey.getEncoded());
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            PrivateKey priKey = keyFactory.generatePrivate(keySpec);
    
            Signature signature = Signature.getInstance(SIGN_ALGORITHM);
            signature.initSign(priKey);
            signature.update(data);//        
            return signature.sign();
        }
    
        /**
         *     (   ,  ,      )
         */
        public static boolean valid(byte[] data, byte[] publicKey, byte[] sign) throws Exception{
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);
            PublicKey pubKey = keyFactory.generatePublic(keySpec);
    
            Signature signature = Signature.getInstance(SIGN_ALGORITHM);
            signature.initVerify(pubKey);
            signature.update(data);
            return signature.verify(sign);
        }
    
        public static void main(String[] args) throws Exception {
            String data = "123456";
            KeyPair keyPair = initKey();
            byte[] sign = sign(data.getBytes(),keyPair.getPrivate());
            boolean isValid = valid(data.getBytes(),keyPair.getPublic().getEncoded(),sign);
            System.out.println(isValid);
        }
    
    }