您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

常用数字签名算法是什么

2024/6/16 23:37:34发布38次查看
数字签名是一个带有密钥的消息摘要算法,这个密钥包括了公钥和私钥,用于验证数据完整性、认证数据来源和抗否认,遵循osi参考模型、私钥签名和公钥验证。也是非对称加密算法和消息摘要算法的结合体,常见的数字签名算法主要有rsa、dsa、ecdsa三种。
rsa是目前计算机密码学中最经典算法,也是目前为止使用最广泛的数字签名算法,rsa数字签名算法的密钥实现与rsa的加密算法是一样的,算法的名称都叫rsa。
它的消息传递操作是:
1、由消息发送方构建密匙对,
2、由消息发送的一方公布公钥至消息接收方,
3、消息发送方对消息用私钥做签名处理
4、消息接收方用公钥对消息做验证
rsa的数字签名代码实现:
dsa签名实现类似,ecdsa实现相比前两者在密匙对成功的方式上存在差别。
import org.apache.commons.codec.binary.base64;import java.security.*;import java.security.interfaces.rsaprivatekey;import java.security.interfaces.rsapublickey;import java.security.spec.pkcs8encodedkeyspec;import java.security.spec.x509encodedkeyspec;import java.util.hashmap;import java.util.map;public class rsasignature { private static final string key_algorithm="rsa"; private static final string signature_algorithm="md5withrsa"; private static final string public_key="rsapublickey"; private static final string private_key="rsaprivatekey"; /** * rsa密匙长度,默认是1024位,密匙长度必须是在64的倍数 * 范围是512--65536之间 * */ private static final int key_size = 512; public static void main(string[] args) throws exception { string str = "hello vison"; map<string, object> map = initkey(); byte[] privatekey = getprivatekey(map); //签名 byte[] signdata = sign(str.getbytes(), privatekey); system.out.println("signdata: " + base64.encodebase64(signdata)); //校验 byte[] pulickey = getpulickey(map); boolean status = verify(str.getbytes(), pulickey, signdata); system.out.println("verify result: " + status); } /** * * @param data 待校验的数据 * @param key 公钥 * @param sign 数据签名 * @return boolean 校验成功返回true,否则返回false * @throws exception */ public static boolean verify(byte[] data,byte[] key,byte[] sign)throws exception{ //获取公钥 x509encodedkeyspec x509encodedkeyspec = new x509encodedkeyspec(key); keyfactory keyfactory = keyfactory.getinstance(key_algorithm); publickey publickey = keyfactory.generatepublic(x509encodedkeyspec); //校验数据 signature signature = signature.getinstance(signature_algorithm); signature.initverify(publickey); signature.update(data); return signature.verify(sign); } /** * 私钥签名 * @param data 待签名数据 * @param key 私钥 * @return byte[] 加密数据 * @throws exception */ public static byte[] sign(byte[] data,byte[] key) throws exception { //获取私钥 pkcs8encodedkeyspec pkcs8encodedkeyspec = new pkcs8encodedkeyspec(key); keyfactory keyfactory = keyfactory.getinstance(key_algorithm); privatekey privatekey = keyfactory.generateprivate(pkcs8encodedkeyspec); //签名 signature signature = signature.getinstance(signature_algorithm); signature.initsign(privatekey); signature.update(data); return signature.sign(); } /** * 获取私钥 * @param keymap * @return */ public static byte[] getprivatekey(map<string,object> keymap){ key key = (key) keymap.get(private_key); return key.getencoded(); } /** * 获取公钥 * @param keymap * @return */ public static byte[] getpulickey(map<string,object> keymap){ key key = (key) keymap.get(public_key); return key.getencoded(); } /** * 初始化密匙对 * @return map 密钥map * @throws exception */ public static map<string,object> initkey() throws exception { //实例化密钥对生成器 keypairgenerator keypairgenerator = keypairgenerator.getinstance(key_algorithm); //初始化 keypairgenerator.initialize(key_size); //生成密匙对 keypair keypair = keypairgenerator.genkeypair(); //私钥 rsaprivatekey privatekey = (rsaprivatekey)keypair.getprivate(); //公钥 rsapublickey publickey = (rsapublickey)keypair.getpublic(); //封装密钥 hashmap<string, object> map = new hashmap<>(2); map.put(public_key,publickey); map.put(private_key,privatekey); return map; }}
以上就是常用数字签名算法是什么的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product