数字签名技术及加密算法

编程入门 行业动态 更新时间:2024-10-26 16:32:27

<a href=https://www.elefans.com/category/jswz/34/1768647.html style=数字签名技术及加密算法"/>

数字签名技术及加密算法

最近由于需要使用数字签名,于是了解一下各种算法的利弊及实现

数字签名流程图:

---------BASE64-----------

常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。
BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。

    /*** BASE64解密* @param key* @return* @throws Exception*/public static byte[] decryptBASE64(String key) throws Exception {return (new BASE64Decoder()).decodeBuffer(key);//decodeBuffer 是加密后产生的字节位数是8的倍数,如果不够位数以=符号填充}

decodeBuffer作用将key转为一个byte数组,源码如下:

public byte[] decodeBuffer(String var1) throws IOException {byte[] var2 = new byte[var1.length()]; //将得到的字符串var1的长度生成新的一个字节数组;var1.getBytes(0, var1.length(), var2, 0);ByteArrayInputStream var3 = new ByteArrayInputStream(var2);ByteArrayOutputStream var4 = new ByteArrayOutputStream();this.decodeBuffer(var3, var4);return var4.toByteArray();}

========================================================

---------MD5-----------

注:一般不直接使用MD5加密。通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串。

/*
* @param data
* @return
* @throws Exception
*/public static byte[] encryptMD5(byte[] data) throws Exception {MessageDigest md5 = MessageDigest.getInstance(KEY_MD5); //获得实例md5.update(data);return md5.digest();}

---------HMAC-----------

HMAC(Hash Message Authentication Code,散列消息鉴别码
基于密钥的Hash算法的认证协议。
消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。
使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。

/*** HMAC加密** @param data* @param key* @return* @throws Exception*/public static byte[] encryptHMAC(byte[] data, String key) throws Exception {SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);Mac mac = Mac.getInstance(secretKey.getAlgorithm());mac.init(secretKey);return mac.doFinal(data);}

all code display as follows:

package com.yjpi;import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;public class Coder {private static final String KEY_MD5 = "MD5";private static final String KEY_SHA = "SHA";private static final String KEY_MAC = "MAC";/*===============================BASE64=================================================*//*** 常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。* BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。** BASE64解密** @param key* @return* @throws Exception*/public static byte[] decryptBASE64(String key) throws Exception {return (new BASE64Decoder()).decodeBuffer(key);}/*** BASE64加密** @param key* @return* @throws Exception*/public static String encryptBASE64(byte[] key) throws Exception {return (new BASE64Encoder()).encodeBuffer(key);}/*===============================MD5=================================================*//*** MD5加密*不直接使用MD5加密。通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串。* @param data* @return* @throws Exception*/public static byte[] encryptMD5(byte[] data) throws Exception {MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);md5.update(data);return md5.digest();}/*===============================SHA=================================================SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域*//*** SHA加密** @param data* @return* @throws Exception*/public static byte[] encryptSHA(byte[] data) throws Exception {MessageDigest sha = MessageDigest.getInstance(KEY_SHA);sha.update(data);return sha.digest();}/*===============================HMAC=================================================HMAC(Hash Message Authentication Code,散列消息鉴别码基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。*//*** 初始化HMAC密钥** @return* @throws Exception*/public static String initMacKey() throws Exception {KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);SecretKey secretKey = keyGenerator.generateKey();return encryptBASE64(secretKey.getEncoded());}/*** HMAC加密** @param data* @param key* @return* @throws Exception*/public static byte[] encryptHMAC(byte[] data, String key) throws Exception {SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);Mac mac = Mac.getInstance(secretKey.getAlgorithm());mac.init(secretKey);return mac.doFinal(data);}}
  • 测试类
package com.yjpi;import org.junit.Before;
import org.junit.Test;import java.util.Map;import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertTrue;public class RSACoderTest {private String publicKey;private String privateKey;@Beforepublic void setUp() throws Exception {Map<String, Object> keyMap = RSACoder.initKey();publicKey = RSACoder.getPublicKey(keyMap);privateKey = RSACoder.getPrivateKey(keyMap);System.err.println("公钥: \n\r" + publicKey);System.err.println("私钥: \n\r" + privateKey);}@Testpublic void test() throws Exception {System.err.println("公钥加密——私钥解密");String inputStr = "xyz";byte[] data = inputStr.getBytes();byte[] encodedData = RSACoder.encryptByPublicKey(data, publicKey);byte[] decodedData = RSACoder.decryptByPrivateKey(encodedData,privateKey);String outputStr = new String(decodedData);System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr);assertEquals(inputStr, outputStr);}@Testpublic void testSign() throws Exception {System.err.println("私钥加密——公钥解密");String inputStr = "sign";byte[] data = inputStr.getBytes();byte[] encodedData = RSACoder.encryptByPrivateKey(data, privateKey);byte[] decodedData = RSACoder.decryptByPublicKey(encodedData, publicKey);String outputStr = new String(decodedData);System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr);assertEquals(inputStr, outputStr);System.err.println("私钥签名——公钥验证签名");// 产生签名String sign = RSACoder.sign(encodedData, privateKey);System.err.println("签名:\r" + sign);// 验证签名boolean status = RSACoder.verify(encodedData, publicKey, sign);System.err.println("状态:\r" + status);assertTrue(status);}}

-控制台输出结果:
不管你在哪儿,我都会找寻

更多推荐

数字签名技术及加密算法

本文发布于:2023-06-16 17:38:01,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/747826.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数字签名   加密算法   技术

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!