导航:首页 > 文档加密 > 私钥加密例子

私钥加密例子

发布时间:2022-06-22 11:34:59

① 关于加密、解密算法、密钥,哪位能给我举个形象的例子

加密就像你钥匙深进钥匙孔,逆时针转一下
解密就像你钥匙深进钥匙孔,顺时针转一下
密钥就像你那把钥匙上面的齿
暴力破解就像做了世界上所有可能的齿的钥匙,一把一把试。不可以理解为直接砸开。
就像商场里衣服上有个锁,如果没有钥匙,就算怎么弄开,那件衣服都没法穿了。所以就一定要有钥匙。
所以密钥叫作key(钥匙)

应该很形象了吧。

加密从数学角度就是一个像函数c=E(m,k)
输入:m是消息明文,k是密钥,
输出:c是消息密文

D是E的反函数,m'=D(c',k')
输入:c'是消息密文,k'是密钥,
输出:m'是消息明文

当c=c', k=k'时,一定有m=m'

c,m,k可以看成一个个大整数,比如c=394783579347293479382。
最简单的一个加密就是
E(m,k)=m+k
D(c,k)=c-k

② 公钥和私钥技术的区别

(一)对称加密(Symmetric Cryptography)
对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key),这种方法在密码学中叫做对称加密算法。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。
对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解;但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。密钥的大小既要照顾到安全性,也要照顾到效率,是一个trade-off。
2000年10月2日,美国国家标准与技术研究所(NIST--American National Institute of Standards and Technology)选择了Rijndael算法作为新的高级加密标准(AES--Advanced Encryption Standard)。.NET中包含了Rijndael算法,类名叫RijndaelManaged,下面举个例子。
加密过程:

private string myData = "hello";
private string myPassword = "OpenSesame";
private byte[] cipherText;
private byte[] salt = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0 };

private void mnuSymmetricEncryption_Click(object sender, RoutedEventArgs e)
{
var key = new Rfc2898DeriveBytes(myPassword, salt);
// Encrypt the data.
var algorithm = new RijndaelManaged();
algorithm.Key = key.GetBytes(16);
algorithm.IV = key.GetBytes(16);
var sourceBytes = new System.Text.UnicodeEncoding().GetBytes(myData);
using (var sourceStream = new MemoryStream(sourceBytes))
using (var destinationStream = new MemoryStream())
using (var crypto = new CryptoStream(sourceStream, algorithm.CreateEncryptor(), CryptoStreamMode.Read))
{
moveBytes(crypto, destinationStream);
cipherText = destinationStream.ToArray();
}
MessageBox.Show(String.Format("Data:{0}{1}Encrypted and Encoded:{2}", myData, Environment.NewLine, Convert.ToBase64String(cipherText)));
}
private void moveBytes(Stream source, Stream dest)
{
byte[] bytes = new byte[2048];
var count = source.Read(bytes, 0, bytes.Length);
while (0 != count)
{
dest.Write(bytes, 0, count);
count = source.Read(bytes, 0, bytes.Length);
}
}

解密过程:

private void mnuSymmetricDecryption_Click(object sender, RoutedEventArgs e)
{
if (cipherText == null)
{
MessageBox.Show("Encrypt Data First!");
return;
}
var key = new Rfc2898DeriveBytes(myPassword, salt);
// Try to decrypt, thus showing it can be round-tripped.
var algorithm = new RijndaelManaged();
algorithm.Key = key.GetBytes(16);
algorithm.IV = key.GetBytes(16);
using (var sourceStream = new MemoryStream(cipherText))
using (var destinationStream = new MemoryStream())
using (var crypto = new CryptoStream(sourceStream, algorithm.CreateDecryptor(), CryptoStreamMode.Read))
{
moveBytes(crypto, destinationStream);
var decryptedBytes = destinationStream.ToArray();
var decryptedMessage = new UnicodeEncoding().GetString(
decryptedBytes);
MessageBox.Show(decryptedMessage);
}
}

对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。

(二)非对称加密(Asymmetric Cryptography)
1976年,美国学者Dime和Henman为解决信息公开传送和密钥管理问题,提出一种新的密钥交换协议,允许在不安全的媒体上的通讯双方交换信息,安全地达成一致的密钥,这就是“公开密钥系统”。相对于“对称加密算法”这种方法也叫做“非对称加密算法”。
非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。
目前最常用的非对称加密算法是RSA算法,是Rivest, Shamir, 和Adleman于1978年发明,他们那时都是在MIT。.NET中也有RSA算法,请看下面的例子:
加密过程:

private byte[] rsaCipherText;
private void mnuAsymmetricEncryption_Click(object sender, RoutedEventArgs e)
{
var rsa = 1;
// Encrypt the data.
var cspParms = new CspParameters(rsa);
cspParms.Flags = CspProviderFlags.UseMachineKeyStore;
cspParms.KeyContainerName = "My Keys";
var algorithm = new RSACryptoServiceProvider(cspParms);
var sourceBytes = new UnicodeEncoding().GetBytes(myData);
rsaCipherText = algorithm.Encrypt(sourceBytes, true);
MessageBox.Show(String.Format("Data: {0}{1}Encrypted and Encoded: {2}",
myData, Environment.NewLine,
Convert.ToBase64String(rsaCipherText)));
}

解密过程:

private void mnuAsymmetricDecryption_Click(object sender, RoutedEventArgs e)
{
if(rsaCipherText==null)
{
MessageBox.Show("Encrypt First!");
return;
}
var rsa = 1;
// decrypt the data.
var cspParms = new CspParameters(rsa);
cspParms.Flags = CspProviderFlags.UseMachineKeyStore;
cspParms.KeyContainerName = "My Keys";
var algorithm = new RSACryptoServiceProvider(cspParms);
var unencrypted = algorithm.Decrypt(rsaCipherText, true);
MessageBox.Show(new UnicodeEncoding().GetString(unencrypted));
}

虽然非对称加密很安全,但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。为了解释这个过程,请看下面的例子:
(1) Alice需要在银行的网站做一笔交易,她的浏览器首先生成了一个随机数作为对称密钥。
(2) Alice的浏览器向银行的网站请求公钥。
(3) 银行将公钥发送给Alice。
(4) Alice的浏览器使用银行的公钥将自己的对称密钥加密。
(5) Alice的浏览器将加密后的对称密钥发送给银行。
(6) 银行使用私钥解密得到Alice浏览器的对称密钥。
(7) Alice与银行可以使用对称密钥来对沟通的内容进行加密与解密了。

(三)总结
(1) 对称加密加密与解密使用的是同样的密钥,所以速度快,但由于需要将密钥在网络传输,所以安全性不高。
(2) 非对称加密使用了一对密钥,公钥与私钥,所以安全性高,但加密与解密速度慢。
(3) 解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。

③ 公钥与私钥的区别与应用。

现实生活中,我要给依依转1个比特币,我需要在比特币交易平台、比特币钱包或者比特币客户端里面,输入我的比特币钱包地址、依依的钱包地址、转出比特币的数量、手续费。然后,我们等十分钟左右,矿工处理完交易信息之后,这1个比特币就成功地转给依依了。

这个过程看似很简单也很便捷,跟我们现在的银行卡转账没什么区别,但是,你知道这个过程是怎样在比特币系统里面实现的吗?它隐藏了哪些原理呢?又或者,它是如何保证交易能够在一个安全的环境下进行呢?

我们今天就来讲一讲。

对于转出方和接收方来讲,也就是我和依依(我是转出方,依依是接收方)我们都需要出具两个东西:钱包地址、私钥。

我们先说钱包地址。比特币钱包地址其实就相当于银行卡、支付宝账号、微信钱包账号,是比特币支付转账的“凭证”,记录着平台与平台、钱包与钱包、钱包与平台之间的转账信息。

我们在使用银行卡、支付宝、微信转账时都需要密码,才能够支付成功。那么,在比特币转账中,同样也有这么一个“密码”,这个“密码“被称作“私钥”。掌握了私钥,就掌握了其对应比特币地址上的生杀大权。

“私钥”是属于“非对称加密算法”里面的概念,与之对应的还有另一个概念,名叫:“公钥”。

公钥和私钥,从字面意思我们就可以理解:公钥,是可以公开的;而私钥,是私人的、你自己拥有的、需要绝对保密的。

公钥是根据私钥计算形成的,比特币系统使用的是椭圆曲线加密算法,来根据私钥计算出公钥。这就使得,公钥和私钥形成了唯一对应的关系:当你用了其中一把钥匙加密信息时,只有配对的另一把钥匙才能解密。所以,正是基于这种唯一对应的关系,它们可以用来验证信息发送方的身份,还可以做到绝对的保密。

我们举个例子讲一下,在非对称加密算法中,公钥和私钥是怎么运作的。

我们知道,公钥是可以对外公开的,那么,所有人都知道我们的公钥。在转账过程中,我不仅要确保比特币转给依依,而不会转给别人,还得让依依知道,这些比特币是我转给她的,不是鹿鹿,也不是韭哥。

比特币系统可以满足我的上述诉求:比特币系统会把我的交易信息缩短成固定长度的字符串,也就是一段摘要,然后把我的私钥附在这个摘要上,形成一个数字签名。因为数字签名里面隐含了我的私钥信息,所以,数字签名可以证明我的身份。

完成之后,完整的交易信息和数字签名会一起广播给矿工,矿工用我的公钥进行验证、看看我的公钥和我的数字签名能不能匹配上,如果验证成功,都没问题,那么,就能够说明这个交易确实是我发出的,而且信息没有被更改。

接下来,矿工需要验证,这笔交易花费的比特币是否是“未被花费”的交易。如果验证成功,则将其放入“未确认交易”,等待被打包;如果验证失败,则该交易会被标记为“无效交易”,不会被打包。

其实,公钥和私钥,简单理解就是:既然是加密,那肯定是不希望别人知道我的消息,所以只能我才能解密,所以可得出:公钥负责加密,私钥负责解密;同理,既然是签名,那肯定是不希望有人冒充我的身份,只有我才能发布这个数字签名,所以可得出:私钥负责签名,公钥负责验证。

到这里,我们简单概括一下上面的内容。上面我们主要讲到这么几个词:私钥、公钥、钱包地址、数字签名,它们之间的关系我们理一下:

(1)私钥是系统随机生成的,公钥是由私钥计算得出的,钱包地址是由公钥计算得出的,也就是:私钥——公钥——钱包地址,这样一个过程;

(2)数字签名,是由交易信息+私钥信息计算得出的,因为数字签名隐含私钥信息,所以可以证明自己的身份。

私钥、公钥都是密码学范畴的,属于“非对称加密”算法中的“椭圆加密算法”,之所以采用这种算法,是为了保障交易的安全,二者的作用在于:

(1)公钥加密,私钥解密:公钥全网公开,我用依依的公钥给信息加密,依依用自己的私钥可以解密;

(2)私钥签名,公钥验证:我给依依发信息,我加上我自己的私钥信息形成数字签名,依依用我的公钥来验证,验证成功就证明的确是我发送的信息。

只不过,在比特币交易中,加密解密啦、验证啦这些都交给矿工了。

至于我们现在经常用的钱包APP,只不过是私钥、钱包地址和其他区块链数据的管理工具而已。钱包又分冷钱包和热钱包,冷钱包是离线的,永远不联网的,一般是以一些实体的形式出现,比如小本子什么的;热钱包是联网的,我们用的钱包APP就属于热钱包。

④ 关于私钥加密 公钥解密

如果只是单方面采用非对称性加密算法,其实有两种方式,用于不同用处.
第一种是签名,使用私钥加密,公钥解密,用于让所有公钥所有者验证私钥所有者的身份并且用来防止私钥所有者发布的内容被篡改.但是不用来保证内容不被他人获得.
第二种是加密,用公钥加密,私钥解密,用于向公钥所有者发布信息,这个信息可能被他人篡改,但是无法被他人获得.
如果甲想给乙发一个安全的保密的数据,那么应该甲乙各自有一个私钥,甲先用乙的公钥加密这段数据,再用自己的私钥加密这段加密后的数据.最后再发给乙,这样确保了内容即不会被读取,也不会被篡改.

⑤ 最着名的私钥加密算法是

MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。
MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。
MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫 readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。
MD5还广泛用于加密和解密技术上,在很多操作系统中,用户的密码是以MD5值(或类似的其它算法)的方式保存的, 用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,而系统并不“知道”用户的密码是什么。
RSA是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。它经历了各种攻击,至今未被完全攻破。
DES算法
美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告。 1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES?Data Encryption Standard)。

⑥ CryptoAPI怎样公钥加密私钥解密

本文主要谈一下密码学中的加密和数字签名,以及其在java中如何进行使用。对密码学有兴趣的伙伴,推荐看Bruce Schneier的着作:Applied Crypotography。在jdk1.5的发行版本中安全性方面有了很大的改进,也提供了对RSA算法的直接支持,现在我们从实例入手解决问题(本文仅是作为简单介绍): 一、密码学上常用的概念 1)消息摘要: 这是一种与消息认证码结合使用以确保消息完整性的技术。主要使用单向散列函数算法,可用于检验消息的完整性,和通过散列密码直接以文本形式保存等,目前广泛使用的算法有MD4、MD5、SHA-1,jdk1.5对上面都提供了支持,在java中进行消息摘要很简单, java.security.MessageDigest提供了一个简易的操作方法: /** *MessageDigestExample.java *Copyright 2005-2-16 */ import java.security.MessageDigest; /** *单一的消息摘要算法,不使用密码.可以用来对明文消息(如:密码)隐藏保存 */ public class MessageDigestExample{ public static void main(String[] args) throws Exception{ if(args.length!=1){ System.err.println("Usage:java MessageDigestExample text"); System.exit(1); } byte[] plainText=args[0].getBytes("UTF8"); //使用getInstance("算法")来获得消息摘要,这里使用SHA-1的160位算法 MessageDigest messageDigest=MessageDigest.getInstance("SHA-1"); System.out.println(" "+messageDigest.getProvider().getInfo()); //开始使用算法 messageDigest.update(plainText); System.out.println(" Digest:"); //输出算法运算结果 System.out.println(new String(messageDigest.digest(),"UTF8")); } } 还可以通过消息认证码来进行加密实现,javax.crypto.Mac提供了一个解决方案,有兴趣者可以参考相关API文档,本文只是简单介绍什么是摘要算法。 2)私钥加密: 消息摘要只能检查消息的完整性,但是单向的,对明文消息并不能加密,要加密明文的消息的话,就要使用其他的算法,要确保机密性,我们需要使用私钥密码术来交换私有消息。 这种最好理解,使用对称算法。比如:A用一个密钥对一个文件加密,而B读取这个文件的话,则需要和A一样的密钥,双方共享一个私钥(而在web环境下,私钥在传递时容易被侦听): 使用私钥加密的话,首先需要一个密钥,可用javax.crypto.KeyGenerator产生一个密钥(java.security.Key),然后传递给一个加密工具(javax.crypto.Cipher),该工具再使用相应的算法来进行加密,主要对称算法有:DES(实际密钥只用到56位),AES(支持三种密钥长度:128、192、256位),通常首先128位,其他的还有DESede等,jdk1.5种也提供了对对称算法的支持,以下例子使用AES算法来加密: /** *PrivateExmaple.java *Copyright 2005-2-16 */ import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import java.security.Key; /** *私鈅加密,保证消息机密性 */ public class PrivateExample{ public static void main(String[] args) throws Exception{ if(args.length!=1){ System.err.println("Usage:java PrivateExample "); System.exit(1); } byte[] plainText=args[0].getBytes("UTF8"); //通过KeyGenerator形成一个key System.out.println(" Start generate AES key"); KeyGenerator keyGen=KeyGenerator.getInstance("AES"); keyGen.init(128); Key key=keyGen.generateKey(); System.out.println("Finish generating DES key"); //获得一个私鈅加密类Cipher,ECB是加密方式,PKCS5Padding是填充方法 Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding"); System.out.println(" "+cipher.getProvider().getInfo()); //使用私鈅加密 System.out.println(" Start encryption:"); cipher.init(Cipher.ENCRYPT_MODE,key); byte[] cipherText=cipher.doFinal(plainText); System.out.println("Finish encryption:"); System.out.println(new String(cipherText,"UTF8")); System.out.println(" Start decryption:"); cipher.init(Cipher.DECRYPT_MODE,key); byte[] newPlainText=cipher.doFinal(cipherText); System.out.println("Finish decryption:"); System.out.println(new String(newPlainText,"UTF8")); } } 3)公钥加密: 上面提到,私钥加密需要一个共享的密钥,那么如何传递密钥呢?web环境下,直接传递的话很容易被侦听到,幸好有了公钥加密的出现。公钥加密也叫不对称加密,不对称算法使用一对密钥对,一个公钥,一个私钥,使用公钥加密的数据,只有私钥能解开(可用于加密);同时,使用私钥加密的数据,只有公钥能解开(签名)。但是速度很慢(比私钥加密慢100到1000倍),公钥的主要算法有RSA,还包括Blowfish,Diffie-Helman等,jdk1.5种提供了对RSA的支持,是一个改进的地方: /** *PublicExample.java *Copyright 2005-2-16 */ import java.security.Key; import javax.crypto.Cipher; import java.security.KeyPairGenerator; import java.security.KeyPair; /** *一个简单的公鈅加密例子,Cipher类使用KeyPairGenerator生成的公鈅和私鈅 */ public class PublicExample{ public static void main(String[] args) throws Exception{ if(args.length!=1){ System.err.println("Usage:java PublicExample "); System.exit(1); } byte[] plainText=args[0].getBytes("UTF8"); //构成一个RSA密钥 System.out.println(" Start generating RSA key"); KeyPairGenerator keyGen=KeyPairGenerator.getInstance("RSA"); keyGen.initialize(1024); KeyPair key=keyGen.generateKeyPair(); System.out.println("Finish generating RSA key"); //获得一个RSA的Cipher类,使用公鈅加密 Cipher cipher=Cipher.getInstance("RSA/ECB/PKCS1Padding"); System.out.println(" "+cipher.getProvider().getInfo()); System.out.println(" Start encryption"); cipher.init(Cipher.ENCRYPT_MODE,key.getPublic()); byte[] cipherText=cipher.doFinal(plainText); System.out.println("Finish encryption:"); System.out.println(new String(cipherText,"UTF8")); //使用私鈅解密 System.out.println(" Start decryption"); cipher.init(Cipher.DECRYPT_MODE,key.getPrivate()); byte[] newPlainText=cipher.doFinal(cipherText); System.out.println("Finish decryption:"); System.out.println(new String(newPlainText,"UTF8")); } } 4)数字签名: 数字签名,它是确定交换消息的通信方身份的第一个级别。上面A通过使用公钥加密数据后发给B,B利用私钥解密就得到了需要的数据,问题来了,由于都是使用公钥加密,那么如何检验是A发过来的消息呢?上面也提到了一点,私钥是唯一的,那么A就可以利用A自己的私钥进行加密,然后B再利用A的公钥来解密,就可以了;数字签名的原理就基于此,而通常为了证明发送数据的真实性,通过利用消息摘要获得简短的消息内容,然后再利用私钥进行加密散列数据和消息一起发送。java中为数字签名提供了良好的支持,java.security.Signature类提供了消息签名: /** *DigitalSignature2Example.java *Copyright 2005-2-16 */ import java.security.Signature; import java.security.KeyPairGenerator; import java.security.KeyPair; import java.security.SignatureException; /** *数字签名,使用RSA私钥对对消息摘要签名,然后使用公鈅验证 测试 */ public class DigitalSignature2Example{ public static void main(String[] args) throws Exception{ if(args.length!=1){ System.err.println("Usage:java DigitalSignature2Example "); System.exit(1); } byte[] plainText=args[0].getBytes("UTF8"); //形成RSA公钥对 System.out.println(" Start generating RSA key"); KeyPairGenerator keyGen=KeyPairGenerator.getInstance("RSA"); keyGen.initialize(1024); KeyPair key=keyGen.generateKeyPair(); System.out.println("Finish generating RSA key"); //使用私鈅签名 Signature sig=Signature.getInstance("SHA1WithRSA"); sig.initSign(key.getPrivate()); sig.update(plainText); byte[] signature=sig.sign(); System.out.println(sig.getProvider().getInfo()); System.out.println(" Signature:"); System.out.println(new String(signature,"UTF8")); //使用公鈅验证 System.out.println(" Start signature verification"); sig.initVerify(key.getPublic()); sig.update(plainText); try{ if(sig.verify(signature)){ System.out.println("Signature verified"); }else System.out.println("Signature failed"); }catch(SignatureException e){ System.out.println("Signature failed"); } } } 5)数字证书。 还有个问题,就是公钥问题,A用私钥加密了,那么B接受到消息后,用A提供的公钥解密;那么现在有个讨厌的C,他把消息拦截了,然后用自己的私钥加密,同时把自己的公钥发给B,并告诉B,那是A的公钥,结果....,这时候就需要一个中间机构出来说话了(相信权威,我是正确的),就出现了Certificate Authority(也即CA),有名的CA机构有Verisign等,目前数字认证的工业标准是:CCITT的X.509: 数字证书:它将一个身份标识连同公钥一起进行封装,并由称为认证中心或 CA 的第三方进行数字签名。 密钥库:java平台为你提供了密钥库,用作密钥和证书的资源库。从物理上讲,密钥库是缺省名称为 .keystore 的文件(有一个选项使它成为加密文件)。密钥和证书可以拥有名称(称为别名),每个别名都由唯一的密码保护。密钥库本身也受密码保护;您可以选择让每个别名密码与主密钥库密码匹配。 使用工具keytool,我们来做一件自我认证的事情吧(相信我的认证): 1、创建密钥库keytool -genkey -v -alias feiUserKey -keyalg RSA 默认在自己的home目录下(windows系统是c:documents and settings<你的用户名> 目录下的.keystore文件),创建我们用 RSA 算法生成别名为 feiUserKey 的自签名的证书,如果使用了-keystore mm 就在当前目录下创建一个密钥库mm文件来保存密钥和证书。 2、查看证书:keytool -list 列举了密钥库的所有的证书 也可以在dos下输入keytool -help查看帮助。 4)数字签名: 数字签名,它是确定交换消息的通信方身份的第一个级别。上面A通过使用公钥加密数据后发给B,B利用私钥解密就得到了需要的数据,问题来了,由于都是使用公钥加密,那么如何检验是A发过来的消息呢?上面也提到了一点,私钥是唯一的,那么A就可以利用A自己的私钥进行加密,然后B再利用A的公钥来解密,就可以了;数字签名的原理就基于此,而通常为了证明发送数据的真实性,通过利用消息摘要获得简短的消息内容,然后再利用私钥进行加密散列数据和消息一起发送。java中为数字签名提供了良好的支持,java.security.Signature类提供了消息签名: /** *DigitalSignature2Example.java *Copyright 2005-2-16 */ import java.security.Signature; import java.security.KeyPairGenerator; import java.security.KeyPair; import java.security.SignatureException; /** *数字签名,使用RSA私钥对对消息摘要签名,然后使用公鈅验证 测试 */ public class DigitalSignature2Example{ public static void main(String[] args) throws Exception{ if(args.length!=1){ System.err.println("Usage:java DigitalSignature2Example "); System.exit(1); } byte[] plainText=args[0].getBytes("UTF8"); //形成RSA公钥对 System.out.println(" Start generating RSA key"); KeyPairGenerator keyGen=KeyPairGenerator.getInstance("RSA"); keyGen.initialize(1024); KeyPair key=keyGen.generateKeyPair(); System.out.println("Finish generating RSA key"); //使用私鈅签名 Signature sig=Signature.getInstance("SHA1WithRSA"); sig.initSign(key.getPrivate()); sig.update(plainText); byte[] signature=sig.sign(); System.out.println(sig.getProvider().getInfo()); System.out.println(" Signature:"); System.out.println(new String(signature,"UTF8")); //使用公鈅验证 System.out.println(" Start signature verification"); sig.initVerify(key.getPublic()); sig.update(plainText); try{ if(sig.verify(signature)){ System.out.println("Signature verified"); }else System.out.println("Signature failed"); }catch(SignatureException e){ System.out.println("Signature failed"); } } } 5)数字证书。 还有个问题,就是公钥问题,A用私钥加密了,那么B接受到消息后,用A提供的公钥解密;那么现在有个讨厌的C,他把消息拦截了,然后用自己的私钥加密,同时把自己的公钥发给B,并告诉B,那是A的公钥,结果....,这时候就需要一个中间机构出来说话了(相信权威,我是正确的),就出现了Certificate Authority(也即CA),有名的CA机构有Verisign等,目前数字认证的工业标准是:CCITT的X.509: 数字证书:它将一个身份标识连同公钥一起进行封装,并由称为认证中心或 CA 的第三方进行数字签名。 密钥库:java平台为你提供了密钥库,用作密钥和证书的资源库。从物理上讲,密钥库是缺省名称为 .keystore 的文件(有一个选项使它成为加密文件)。密钥和证书可以拥有名称(称为别名),每个别名都由唯一的密码保护。密钥库本身也受密码保护;您可以选择让每个别名密码与主密钥库密码匹配。 使用工具keytool,我们来做一件自我认证的事情吧(相信我的认证): 1、创建密钥库keytool -genkey -v -alias feiUserKey -keyalg RSA 默认在自己的home目录下(windows系统是c:documents and settings<你的用户名> 目录下的.keystore文件),创建我们用 RSA 算法生成别名为 feiUserKey 的自签名的证书,如果使用了-keystore mm 就在当前目录下创建一个密钥库mm文件来保存密钥和证书。 2、查看证书:keytool -list 列举了密钥库的所有的证书 也可以在dos下输入keytool -help查看帮助。

⑦ 常用的加密算法有哪些

对称密钥加密

对称密钥加密 Symmetric Key Algorithm 又称为对称加密、私钥加密、共享密钥加密:这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单的相互推算的密钥,对称加密的速度一般都很快。

⑧ 私钥的加密算法

基类库中提供的块密码类使用称作密码块链 (CBC) 的链模式,它使用一个密钥和一个初始化向量 (IV) 对数据执行加密转换。对于给定的私钥 k,一 个不使用初始化向量的简单块密码将把相同的明文输入块加密为同样的密文输出块。如果在明文流中有重复的块,那么在密文流中将存在重复的块。如果未经授权的 用户知道有关明文块的结构的任何信息,就可以使用这些信息解密已知的密文块并有可能发现您的密钥。若要克服这个问题,可将上一个块中的信息混合到加密下一 个块的过程中。这样,两个相同的明文块的输出就会不同。由于该技术使用上一个块加密下一个块,因此使用了一个 IV 来加密数据的第一个块。使用该系统, 未经授权的用户有可能知道的公共消息标头将无法用于对密钥进行反向工程。
可 以危及用此类型密码加密的数据的一个方法是,对每个可能的密钥执行穷举搜索。根据用于执行加密的密钥大小,即使使用最快的计算机执行这种搜索,也极其耗 时,因此难以实施。使用较大的密钥大小将使解密更加困难。虽然从理论上说加密不会使对手无法检索加密的数据,但这确实极大增加了这样做的成本。如果执行彻 底搜索来检索只在几天内有意义的数据需要花费三个月的时间,那么穷举搜索的方法是不实用的。
私钥加密的缺点是它假定双方已就密钥和 IV 达成协议,并且互相传达了密钥和 IV 的值。并且,密钥必须对未经授权的用户保密。由于存在这些问题,私钥加密通常与公钥加密一起使用,来秘密地传达密钥和 IV 的值。

⑨ 公钥与私钥

我也刚学,有这样一个例子给你看看,很有用:
RSA算法概述如下:
找两素数p和q
取n=p*q
取t=(p-1)*(q-1)
取任何一个数e,要求满足e<t并且e与t互素(就是最大公因数为1)
取d*e%t==1

这样最终得到三个数: n d e

设消息为数M (M <n)
设c=(M**d)%n就得到了加密后的消息c
设m=(c**e)%n则 m == M,从而完成对c的解密。
注:**表示次方,上面两式中的d和e可以互换。

在加密中:
n d两个数构成公钥,可以告诉别人;
n e两个数构成私钥,e自己保留,不让任何人知道。
给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。
别人给你发送信息时使用d加密,这样只有拥有e的你能够对其解密

而常用公钥体制主要有两个作用:加密信息和认证。由于内容,我把链接给你,你参考着看看……挺好理解的
http://hi..com/piao2007/blog/item/ae2ec4f881f73202d8f9fd57.html

阅读全文

与私钥加密例子相关的资料

热点内容
自己购买云主服务器推荐 浏览:422
个人所得税java 浏览:761
多余的服务器滑道还有什么用 浏览:192
pdf劈开合并 浏览:28
不能修改的pdf 浏览:752
同城公众源码 浏览:489
一个服务器2个端口怎么映射 浏览:298
java字符串ascii码 浏览:79
台湾云服务器怎么租服务器 浏览:475
旅游手机网站源码 浏览:332
android关联表 浏览:945
安卓导航无声音怎么维修 浏览:333
app怎么装视频 浏览:430
安卓系统下的软件怎么移到桌面 浏览:96
windows拷贝到linux 浏览:772
mdr软件解压和别人不一样 浏览:904
单片机串行通信有什么好处 浏览:340
游戏开发程序员书籍 浏览:860
pdf中图片修改 浏览:288
汇编编译后 浏览:491