「java数字签名算法」java 数字签名

博主:adminadmin 2023-01-14 12:48:06 806

今天给各位分享java数字签名算法的知识,其中也会对java 数字签名进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java如何对pdf文件实现数字签名

用Spire.Doc  for Java 可以添加及验证数字签名,参考代码:

import com.spire.pdf.*;

 import com.spire.pdf.graphics.PdfImage;

 import com.spire.pdf.graphics.PdfTrueTypeFont;

 import com.spire.pdf.security.GraphicMode;

 import com.spire.pdf.security.PdfCertificate;

 import com.spire.pdf.security.PdfCertificationFlags;

 import com.spire.pdf.security.PdfSignature;

 

 import java.awt.*;

 import java.awt.geom.Point2D;

 import java.awt.geom.Rectangle2D;

 

 public class AddCertificate {

     public static void main(String[]args){

         //加载PDF文档

         PdfDocument doc = new PdfDocument();

         doc.loadFromFile("test.pdf");

 

         //加载pfx证书,及证书秘钥

         PdfCertificate cert = new PdfCertificate("Cermia.pfx","123654yes!");

 

         //添加数字签名到指定页面,并设置其位置和大小

         PdfSignature signature = new PdfSignature(doc, doc.getPages().get(2), cert, "MySignature");

         Rectangle2D rect = new Rectangle2D.Float();

         rect.setFrame(new Point2D.Float((float) doc.getPages().get(0).getActualSize().getWidth() - 340, (float) doc.getPages().get(0).getActualSize().getHeight() - 230), new Dimension(280, 150));

         signature.setBounds(rect);

 

         //设置签名为图片加文本模式

         signature.setGraphicMode(GraphicMode.Sign_Image_And_Sign_Detail);

 

         //设置签名的内容

         signature.setNameLabel("签字者:");

         signature.setName("Mia");

         signature.setContactInfoLabel("联系电话:");

         signature.setContactInfo("02881705109");

         signature.setDateLabel("日期:");

         signature.setDate(new java.util.Date());

         signature.setLocationInfoLabel("地点:");

         signature.setLocationInfo("成都");

         signature.setReasonLabel("原因:");

         signature.setReason("文档所有者");

         signature.setDistinguishedNameLabel("DN: ");

         signature.setDistinguishedName(signature.getCertificate().get_IssuerName().getName());

         signature.setSignImageSource(PdfImage.fromFile("sign.png"));

 

         //设置签名的字体

         signature.setSignDetailsFont(new PdfTrueTypeFont(new Font("Arial Unicode MS", Font.PLAIN, 9)));

 

         //设置文档权限为禁止更改

         signature.setDocumentPermissions(PdfCertificationFlags.Forbid_Changes);

         signature.setCertificated(true);

 

         //保存文档

         doc.saveToFile("AddSignature.pdf");

         doc.close();

     }

 }

数字签名添加效果:

数字签名效果

参考原文

求ECDSA的Java代码

【方案1】

package ECDSA;

import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin;

import java.security.*;

import java.security.interfaces.ECPrivateKey;

import java.security.interfaces.ECPublicKey;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.X509EncodedKeySpec;

public class Ecdsa {

  private static String src = "hello berber" ;

  public static void main(String []args){

      jdkECDSA();

  }

  public static void jdkECDSA(){

      // 1.初始化密钥

      try{

          KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");

          keyPairGenerator.initialize(256);

          KeyPair keyPair = keyPairGenerator.generateKeyPair() ;

          ECPublicKey ecPublicKey = (ECPublicKey)keyPair.getPublic() ;

          ECPrivateKey ecPrivateKey = (ECPrivateKey)keyPair.getPrivate() ;

          // 执行签名

          PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(ecPrivateKey.getEncoded());

          KeyFactory keyFactory = KeyFactory.getInstance("EC") ;

          PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec) ;

          Signature signature = Signature.getInstance("SHA1withECDSA");

          signature.initSign(privateKey);

          signature.update(src.getBytes());

          byte []arr = signature.sign();

          System.out.println("jdk ecdsa sign :"+ HexBin.encode(arr));

          // 验证签名

          X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(ecPublicKey.getEncoded());

          keyFactory = KeyFactory.getInstance("EC");

          PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);

          signature = Signature.getInstance("SHA1withECDSA");

          signature.initVerify(publicKey);

          signature.update(src.getBytes());

          boolean bool = signature.verify(arr);

          System.out.println("jdk ecdsa verify:"+bool);

      }catch(Exception e){

      }

  }

}

Java数字签名——ECDSA算法

【方案2】

public class MyTest {

/**

* @param args

*/

public static void main(String[] args) {

new MyTest().getSign();

}

void getSign() {

// Get the instance of the Key Generator with "EC" algorithm

try {

KeyPairGenerator g = KeyPairGenerator.getInstance("EC");

ECGenParameterSpec kpgparams = new ECGenParameterSpec("secp256r1");

g.initialize(kpgparams);

KeyPair pair = g.generateKeyPair();

// Instance of signature class with SHA256withECDSA algorithm

Signature ecdsaSign = Signature.getInstance("SHA256withECDSA");

ecdsaSign.initSign(pair.getPrivate());

System.out.println("Private Keys is::" + pair.getPrivate());

System.out.println("Public Keys is::" + pair.getPublic());

String msg = "text ecdsa with sha256";//getSHA256(msg)

ecdsaSign.update((msg + pair.getPrivate().toString())

.getBytes("UTF-8"));

byte[] signature = ecdsaSign.sign();

System.out.println("Signature is::"

+ new BigInteger(1, signature).toString(16));

// Validation

ecdsaSign.initVerify(pair.getPublic());

ecdsaSign.update(signature);

if (ecdsaSign.verify(signature))

System.out.println("valid");

else

System.out.println("invalid!!!!");

} catch (Exception e) {

// TODO: handle exception

e.printStackTrace();

}

}}

java – 使用secp256r1曲线和SHA256算法生

怎么验证生成的Ecdsa签名是正确的呢,可以看下这篇文章:RSA,ECC,Ecdsa,国密SM2的签名,验签,加密

java最常用的几种加密算法

简单的Java加密算法有:

第一种. BASE

Base是网络上最常见的用于传输Bit字节代码的编码方式之一,大家可以查看RFC~RFC,上面有MIME的详细规范。Base编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base来将一个较长的唯一标识符(一般为-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。

第二种. MD

MD即Message-Digest Algorithm (信息-摘要算法),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD的前身有MD、MD和MD。

MD算法具有以下特点:

压缩性:任意长度的数据,算出的MD值长度都是固定的。

容易计算:从原数据计算出MD值很容易。

抗修改性:对原数据进行任何改动,哪怕只修改个字节,所得到的MD值都有很大区别。

弱抗碰撞:已知原数据和其MD值,想找到一个具有相同MD值的数据(即伪造数据)是非常困难的。

强抗碰撞:想找到两个不同的数据,使它们具有相同的MD值,是非常困难的。

MD的作用是让大容量信息在用数字签名软件签署私人密钥前被”压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD以外,其中比较有名的还有sha-、RIPEMD以及Haval等。

第三种.SHA

安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于^位的消息,SHA会产生一个位的消息摘要。该算法经过加密专家多年来的发展和改进已日益完善,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。

SHA-与MD的比较

因为二者均由MD导出,SHA-和MD彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:

对强行攻击的安全性:最显著和最重要的区别是SHA-摘要比MD摘要长 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD是^数量级的操作,而对SHA-则是^数量级的操作。这样,SHA-对强行攻击有更大的强度。

对密码分析的安全性:由于MD的设计,易受密码分析的攻击,SHA-显得不易受这样的攻击。

速度:在相同的硬件上,SHA-的运行速度比MD慢。

第四种.HMAC

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

java加密的几种方式

基本的单向加密算法:

BASE64 严格地说,属于编码格式,而非加密算法

MD5(Message Digest algorithm 5,信息摘要算法)

SHA(Secure Hash Algorithm,安全散列算法)

HMAC(Hash Message Authentication Code,散列消息鉴别码)

复杂的对称加密(DES、PBE)、非对称加密算法:

DES(Data Encryption Standard,数据加密算法)

PBE(Password-based encryption,基于密码验证)

RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)

DH(Diffie-Hellman算法,密钥一致协议)

DSA(Digital Signature Algorithm,数字签名)

ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)

代码参考:

/**

* BASE64加密

*

* @param key

* @return

* @throws Exception

*/

public static String encryptBASE64(byte[] key) throws Exception {

return (new BASE64Encoder()).encodeBuffer(key);

}

/**

* MD5加密

*

* @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加密

*

* @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密钥

*

* @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);

}

请解释“数字签名”的概念及工作原理?

数字签名(digital signature )概念:以电子形式存在于数据信息之中的,或作为其附件的或逻辑上与之有联系的数据,可用于辨别数据签署人的身份,并表明签署人对数据信息中包含的信息的认可。

数字签名的工作原理:“发送报文时,发送方用一个哈希函数从报文文本中生成报文摘要,然后用自己的私人密钥对这个摘要进行加密,这个加密后的摘要将作为报文的数字签名和报文一起发送给接收方,接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要,接着再用发送方的公用密钥来对报文附加的数字签名进行解密,如果这两个摘要相同、那么接收方就能确认该数字签名是发送方的。 数字签名有两种功效:一是能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。二是数字签名能确定消息的完整性。因为数字签名的特点是它代表了文件的特征,文件如果发生改变,数字签名的值也将发生变化。不同的文件将得到不同的数字签名。 一次数字签名涉及到一个哈希函数、发送者的公钥、发送者的私钥。”这报文鉴别的描述!数字签名没有那么复杂。 数字签名: 发送方用自己的密钥对报文X进行D运算,生成不可读取的密文Dsk,然后将Dsx传送给接收方,接收方为了核实签名,用发送方的密钥进行E运算,还原报文。

每个人都有一对“钥匙”(数字身份),其中一个只有她/他本人知道(密钥),另一个公开的(公钥)。签名的时候用密钥,验证签名的时候用公钥。又因为任何人都可以落款声称她/他就是你,因此公钥必须向接受者信任的人(身份认证机构)来注册。注册后身份认证机构给你发一数字证书。对文件签名后,你把此数字证书连同文件及签名一起发给接受者,接受者向身份认证机构求证是否真地是用你的密钥签发的文件。

关于java数字签名算法和java 数字签名的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。