首先将加密算法进行一下分类。
散列加密
散列加密一般是不可逆的,即单向加密,无法解密,如:MD5、SHA
对称加密
对称加密只有一个密钥,即通过该密钥进行加密,同样也可以通过该密钥对加密后的内容解密,是可逆的,如:DES算法
非对称加密
非对称加密是有两个密钥,分别为公钥和私钥,通过公钥将内容加密,由私钥将加密后的内容解密,即公钥可以公布,私钥保存,如:DSA、RSA。
非对称加密的签名:通过私钥对一个文件生成摘要信息,即签名,由公钥校验文件和签名是否匹配,如果匹配说明中途没有被篡改过。
以下为签名的关键代码(java)
其中生成的密钥为RSA算法类型的,生成签名的算法为SHA256withRSA算法
//生成密钥
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");//使用的加密算法
keyPairGenerator.initialize(1024);//长度
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();//生成的公钥
PrivateKey privateKey = keyPair.getPrivate();//生成的私钥
//生成签名
String plain_text = "需要加密的文本";
Signature sign = Signature.getInstance("SHA256withRSA");//生成签名的类型
sign.initSign(privateKey);
sign.update(plain_text.getBytes());
byte[] signed = sign.sign();
String signetureStr = DatatypeConverter.printBase64Binary(signed);
//校验签名
Signature verifySign = Signature.getInstance("SHA256withRSA");//对应签名的类型
verifySign.initVerify(publicKey);
verifySign.update(plain_text.getBytes());
boolean signedSuccess = verifySign.verify(new BASE64Decoder().decodeBuffer(signetureStr));
System.out.println("验证成功?---" + signedSuccess); //校验是否成功
对于SHA256withRSA和MD5withRSA生成的签名校验见github,附链接: