JAVA暗号化アルゴリズム(5)-デジタル署名アルゴリズム(RSA、DSA)
デジタル署名プロセス
(1)署名の生成:ソースファイルの「デジタル要約」に対して、秘密鍵で暗号化し、「暗号化デジタル要約」を生成する.
(2)検証署名:「暗号化デジタル要約」を公開鍵で復号し、「デジタル要約2」を生成し、「デジタル要約」と「デジタル要約2」を比較し、結果が同じであれば署名検証に合格する.
概念:「公開鍵」と「秘密鍵」を持つ「メッセージ要約」アルゴリズムは、「非対称暗号化アルゴリズム」と「メッセージ要約」アルゴリズムの結合体である
秘密鍵署名、公開鍵検証
一般的な署名アルゴリズム RSASignature DSASignature ECDSASignature(Bouncy Castleが必要) デジタル署名の役割データ整合性の検証 認証データソース 抗否定 シーン
Android App開発者の署名など
RSASignatureの例
(1)署名の生成:ソースファイルの「デジタル要約」に対して、秘密鍵で暗号化し、「暗号化デジタル要約」を生成する.
(2)検証署名:「暗号化デジタル要約」を公開鍵で復号し、「デジタル要約2」を生成し、「デジタル要約」と「デジタル要約2」を比較し、結果が同じであれば署名検証に合格する.
概念:「公開鍵」と「秘密鍵」を持つ「メッセージ要約」アルゴリズムは、「非対称暗号化アルゴリズム」と「メッセージ要約」アルゴリズムの結合体である
秘密鍵署名、公開鍵検証
一般的な署名アルゴリズム
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);
}
}