首页 > 编程知识 正文

数字签名的基本原理,数字签名算法有哪些

时间:2023-05-05 20:08:44 阅读:58993 作者:2458

因为最近需要数字签名,所以我们将了解各种算法的优缺点和实现

数字签名流程图:

--------BASE64---------常见于邮件、http加密中,剪切http信息时,您会发现登录操作的用户名、密码字段在base64中进行了加密。

BASE加密生成的字节位数是8的倍数,如果位数不够,则用=符号填充。

/** * BASE64解密* @ param key * @ return * @ throws exception */public static byte [ ] decrypt base64 (字符串密钥) throws exception 源代码如下所示。

public byte [ ]解码缓冲器[ stringvar1] throwsioexception { byte [ ] var2=new byte [ var1. length ]; //将得到的字符串var1的长度设置为新字节数组; var1.GetBytes(0,var1.length )、var 2,0 ); bytearrayinputstreamvar3=newbytearrayinputstream (var 2; bytearrayoutputstreamvar4=newbytearrayoutputstream (; this.decodebuffer(var3,var4); return var4.toByteArray (; }=====================================

--------MD5--------注:一般不直接使用MD5加密。 通常,将MD5生成的字节数组传递给BASE64并再加密一次,即可得到相应的字符串。

/* * @ param data * @ return * @ throws exception */public static byte [ ] encrypt MD5 (byte [ ] data ) throws exception { mesation } ------------- hmac------ hmac----散列消息认证码,散列消息认证码

基于密钥的混列算法的认证协议。

消息认证码实现认证的原理是,使用公开函数和密钥生成固定长度的值作为认证标识符,并用该标识符认证消息的完整性。

使用一个密钥生成固定大小的小数据块,即MAC,将其添加到消息中并进行传输。 接收方使用与发送方共享的密钥进行认证等。

/** * HMAC加密* * @ param data * @ param key * @ return * @ throws exception */public static byte [ ] encrypt hmac (byte [ ] date ) macmac=MAC.getinstance (secret key.get algorithm ); MAC.init (安全密钥; 返回MAC.do final (data; (3358www.Sina.com/

package com.yjpi; import sun.misc.base64解码器; import sun.misc.base64编码器; import javax.crypto.key generator; import javax.crypto.Mac; 导入javax.crypto.secret key; import javax.crypto.spec.secret key spec; import Java.security.message digest; 公共类编码器{ privatestaticfinalstringkey _ MD5=' MD5 '; 私有状态inalstringkey _ 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; @Before public void setUp() throws Exception { Map<String, Object> keyMap = RSACoder.initKey(); publicKey = RSACoder.getPublicKey(keyMap); privateKey = RSACoder.getPrivateKey(keyMap); System.err.println("公钥: nr" + publicKey); System.err.println("私钥: nr" + privateKey); } @Test public 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 + "nr" + "解密后: " + outputStr); assertEquals(inputStr, outputStr); } @Test public 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 + "nr" + "解密后: " + 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); }}

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。