2 数字签名

2024-05-01 12:38
文章标签 数字签名

本文主要是介绍2 数字签名,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载自:  http://blog.chinaunix.net/uid-7374279-id-4064434.html


基本原理:
    数字签名使用密钥对(公开密钥和私有密钥),任何持有公开密钥的人都能解密、而只有加密密钥持有者(私有密钥)能够生成消息。
使用举例:
    1. A生成一个非对称加密密钥,她用该密钥对明文进行加密。
    2. A将公开密钥以某种方式传递给B。
    3. A用私有密钥生成消息,发给B。
    4. B用公开密钥解密。B能够确认2点:1)原消息没有被篡改。2)是由A加密的,即发出人是A。
说明:
   Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从文件中得到公钥编码的字节数组、如何从字节数组解码公钥。
   最普通的公共密钥算法是Rivest, Shamir, 和 Adleman发明的RSA算法。直到2000年10月,该算法一直受RSA Security公司授予的专利保护。该专利的转让许可证价格昂贵,通常要支付3%的专利权使用费,每年至少付款50 000美元。现在该加密算法已经公开,Java SE 5.0及以后的版本都支持RSA算法。
注意:如果你使用的是旧版本的JDK,可以使用Legion of Bouncy Castle(网址http://www. bouncycastle.org),它提供了一个支持RSA的密码提供商和其他许多SunJCE提供商没有提供的特性。该提供商已经由Sun公司签名,因此可以将它与JDK结合起来使用。
http://hiyachen.blog.chinaunix.net  chf@tsinghua.org.cn http://weibo.com/u/1741045910 
如果要使用RSA算法,需要一对公共/私有密钥。你可以按如下方法使用KeyPairGenerator来获得:
KeyPairGenerator pairgen = KeyPairGenerator.getInstance("RSA");
SecureRandom random = new SecureRandom();
pairgen.initialize(KEYSIZE, random);
KeyPair keyPair = pairgen.generateKeyPair();
Key publicKey = keyPair.getPublic();
Key privateKey = keyPair.getPrivate();
列表9-18中的程序有三个选项。-genkey选项用于产生一个密钥对,-encrypt选项用于生成AES密钥,并且用公共密钥对其进行包装。
Key key = . . .; // an AES key
Key publicKey = . . .; // a public RSA key
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.WRAP_MODE, publicKey);
byte[] wrappedKey = cipher.wrap(key);
然后它便生成一个包含下列内容的文件:
包装过的密钥的长度
包装过的密钥字节
用AES密钥加密的明文
-decrypt选项用于对这样的文件进行解密。请试运行该程序,首先生成RSA密钥:
java RSATest -genkey public.key private.key
然后对一个文件进行加密:
java RSATest -encrypt plaintextFile encryptedFile public.key
最后,对文件进行解密,并且检验解密后的文件是否与明文相匹配。
java RSATest -decrypt encryptedFile decryptedFile private.key

RSATest.java
1. import java.io.*;
2. import java.security.*;
3. import javax.crypto.*;
4.
5. 
13. public class RSATest
14. {
15.    public static void main(String[] args)
16.    {
17.       try
18.       {
19.          if (args[0].equals("-genkey"))
20.          {
21.              KeyPairGenerator pairgen = KeyPairGenerator.getInstance("RSA");
22.              SecureRandom random = new SecureRandom();
23.              pairgen.initialize(KEYSIZE, random);
24.              KeyPair keyPair = pairgen.generateKeyPair();
25.              ObjectOutputStream out = new ObjectOutputStream (new FileOutputStream(args[1]));
26.              out.writeObject(keyPair.getPublic());
27.              out.close();
28.              out = new ObjectOutputStream(new FileOutputStream(args[2]));
29.              out.writeObject(keyPair.getPrivate());
30.              out.close();
31.          }
32.          else if (args[0].equals("-encrypt"))
33.          {
34.             KeyGenerator keygen = KeyGenerator.getInstance("AES");
35.             SecureRandom random = new SecureRandom();
36.             keygen.init(random);
37.             SecretKey key = keygen.generateKey();
38.
39.             // wrap with RSA public key
40.             ObjectInputStream keyIn = new ObjectInputStream
(new FileInputStream(args[3]));
41.             Key publicKey = (Key) keyIn.readObject();
42.             keyIn.close();
43.
44.             Cipher cipher = Cipher.getInstance("RSA");
45.             cipher.init(Cipher.WRAP_MODE, publicKey);
46.             byte[] wrappedKey = cipher.wrap(key);
47.             DataOutputStream out = new DataOutputStream
(new FileOutputStream(args[2]));
48.             out.writeInt(wrappedKey.length);
49.             out.write(wrappedKey);
50.
51.             InputStream in = new FileInputStream(args[1]);
52.             cipher = Cipher.getInstance("AES");
53.             cipher.init(Cipher.ENCRYPT_MODE, key);
54.             crypt(in, out, cipher);
55.             in.close();
56.             out.close();
57.          }
58.          else
59.          {
60.             DataInputStream in = new DataInputStream
(new FileInputStream(args[1]));
61.             int length = in.readInt();
62.             byte[] wrappedKey = new byte[length];
63.             in.read(wrappedKey, 0, length);
64.
65.             // unwrap with RSA private key
66.             ObjectInputStream keyIn = new ObjectInputStream
(new FileInputStream(args[3]));
67.             Key privateKey = (Key) keyIn.readObject();
68.             keyIn.close();
69.
70.             Cipher cipher = Cipher.getInstance("RSA");
71.             cipher.init(Cipher.UNWRAP_MODE, privateKey);
72.             Key key = cipher.unwrap(wrappedKey, "AES", Cipher.SECRET_KEY);
73.
74.             OutputStream out = new FileOutputStream(args[2]);
75.             cipher = Cipher.getInstance("AES");
76.             cipher.init(Cipher.DECRYPT_MODE, key);
77.
78.             crypt(in, out, cipher);
79.             in.close();
80.             out.close();
81.          }
82.       }
83.       catch (IOException e)
84.       {
85.          e.printStackTrace();
86.       }
87.       catch (GeneralSecurityException e)
88.       {
89.          e.printStackTrace();
90.       }
91.       catch (ClassNotFoundException e)
92.       {
93.          e.printStackTrace();
94.       }
95.    }
96.
97.    
104.    public static void crypt(InputStream in, OutputStream out, Cipher cipher)
105.          throws IOException, GeneralSecurityException
106.    {
107.       int blockSize = cipher.getBlockSize();
108.       int outputSize = cipher.getOutputSize(blockSize);
109.       byte[] inBytes = new byte[blockSize];
110.       byte[] outBytes = new byte[outputSize];
111.
112.       int inLength = 0;
113.       ;
114.       boolean more = true;
115.       while (more)
116.       {
117.          inLength = in.read(inBytes);
118.          if (inLength == blockSize)
119.          {
120.             int outLength = cipher.update(inBytes, 0, blockSize, outBytes);
121.             out.write(outBytes, 0, outLength);
122.          }
123.          else more = false;
124.       }
125.       if (inLength > 0) outBytes = cipher.doFinal(inBytes, 0, inLength);
126.       else outBytes = cipher.doFinal();
127.       out.write(outBytes);
128.    }
129.
130.    private static final int KEYSIZE = 512;
131. }
你现在已经看到了Java安全模型是如何允许我们去控制代码的执行的,这是Java平台的一个独一无二且越来越重要的方面。你已经看到了Java类库提供的认证和加密服务。但是我们没有涉及许多高级和专有的话题,比如有:
提供了对Kerberos协议进行支持的"通用安全服务"的GSS-API(原则上同样支持其他安全信息交换协议)。下面这个网址上有一份JDK的指南:
http://docs.oracle.com/javase/7/docs/technotes/guides/security/jgss/tutorials/index.html
对SASL的支持,SASL即简单认证和安全层,可以为LDAP和IMAP协议所使用。如果想在自己的应用程序中实现SASL,请浏览下面这个网址:
http://docs.oracle.com/javase/7/docs/technotes/guides/security/sasl/sasl-refguide.html
对SSL的支持,SSL即安全套接层。在HTTP上使用SSL对应用程序的编程人员是透明的,只需要直接使用以https开头的URL即可。如果想要给你的应用程序添加SSL支持,请参阅下面网址中的:JSSE(Java安全套接扩展)参考指南http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html
全面了解java安全策略:http://docs.oracle.com/javase/7/docs/technotes/guides/security/index.html

这篇关于2 数字签名的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/951708

相关文章

数字签名基本流程

文章来源 https://www.cnblogs.com/ycha/p/9556535.html https://blog.csdn.net/qq_16605855/article/details/80966382 签名过程 输入:原文、私;钥输出:签名值 1)将原文做 HASH 2)将 HASH 做私密加密,结果就是签名值 验证签名过程 输入:签名值、原文、公钥输出:是

安装第三方inf 不含数字签名信息的方法

过程中遇到第三方INF不包含数字签名信息  解决方法:左下角搜索栏输入:高级启动-立即重启-疑难解答-高级选项-启动设置-重启-重启之后,电脑就可以安装未签名驱动了

数字签名是什么?[转]

文章来源:http://kan.weibo.com/con/3524902422946278     本文用图片通俗易懂地解释了"数字签名"(digital signature)和"数字证书"(digital certificate)到底是什么。希望多你有帮助。   1.   鲍勃有两把钥匙,一把是公钥,另一把是私钥。   2.   鲍勃把公钥送给他的朋友们----帕蒂、道格

数字签名和数字证书详解

签名 当你在一个纸质文件上写上你的名字,按上你的指纹,就意味着这张纸上的内容经过了你的认可,你的笔迹和指纹就是你身份的证明。这是因为,笔迹很难伪造,而每个人的指纹更是独一无二的。在签名前,我们会检查文件内容有没有歧义、有没有涂改、有没有多余不必要的空白等,确认无误后再写下我们的名字,而收到签名后文件的人,再次对文件内容及签名进行检查,以确保文件内容的有效性和完整性。 因此,签名可以用来认证签名

windows下安装pyenv+解决pyenv install时“未对文件进行数字签名”或“pyenv : 无法加载文件在此系统上禁止运行脚本”的问题

安装pyenv 按照该博主的帖子,安装好pyenv-windows并配置好环境变量: http://t.csdnimg.cn/siQMH 但是执行pyenv install命令时遭遇了如下问题,现在记录一下。 问题1:pyenv : 无法加载文件在此系统上禁止运行脚本。 刚拿到电脑,在电脑上运行`power shell``的同学更可能遇到这个问题。 主要问题出在电脑的执行策略需要更改,可

数字签名算法---加密学习笔记(五)

介绍 签名:就有安全性,抗否认性 数字签名:带有密钥(公钥,私钥)的消息摘要算法 作用: 1. 验证数据的完整性 2. 认证数据来源 3. 抗否认 数字签名遵循:私钥签名,公钥验证 常用的数字签名算法:RSA,DSA,ECDSA RSA 介绍: 是经典算法,是目前为止使用最广泛的数字签名算法。 RSA数字签名算法的密钥实现与RSA的加密算法是一样的,算法的名称都叫RSA。密钥的产生

cab数字签名制作

制作证书 makecert -$ "individual" -r /sv "Smart360.PVK" /n "CN= www.smart360.cn,E=15011116466-163-com,O=lilingtong " smart360.cer 制作inf cabarc.exe -s 6144 N smart.cab zlib.dll qnviccub.dll bridge

高级数字签名之椭圆曲线数字签名算法(ECDSA)

@TOC 1. 算法简述 该算法是微软操作系统及办公软件的序列号验证算法。 ECDSA(Elliptic Curve Digital Signature Algorithm, 椭圆曲线数字签名算法) 于1999年作为ANSI标准, 并于2000年成为IEEE和NIST标准。 ECDSA算法具有速度快、强度高、签名短等有点。 3. 代码实现 Java中未对该算法做实现, 而在Bouncy

数字签名标准算法——DSA

数字签名标准算法——DSA 1. 算法简述2.模型分析3. 代码实现3.1 算法实现3.2 测试代码3.3 运行结果 1. 算法简述 RSA为经典数字签名算法 数字签名标准(Digital Signature Standard, DSS), DSS本质是ElGamal数字签名算法,DSS使用的算法成为数字签名算法(Digital Signature Algorithm, DSA

数字签名算法之RSA

数字签名算法之RSA 1.数字签名简述2. 模型分析3. 代码实现3.1 签名算法实现3.2 测试代码3.3 运行结果 1.数字签名简述 数字签名算法可以看做是一种带有密钥的消息摘要算法,并且这种密钥包含了公钥和私钥。也就是说数字签名算法是非对称加密算法和消息摘要算法的结合体。 数字签名算法是公钥基础设施(PKI)以及许多网络安全机制(SSL/TLS、VPN等)的基础。 数