`

公钥简介 与RSA

 
阅读更多
公钥是与私钥算法一起使用的密钥对的非秘密一半。公钥通常用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据。公钥和私钥是通过一种算法得到的一个密钥对(即一个公钥和一个私钥)其中的一个向外界公开,称为公钥;另一个自己保留,称为私钥。通过这种算法得到的密钥对能保证在世界范围内是唯一的。使用这个密钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密。比如用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会成功。


1976年。当时在美国斯坦福大学的迪菲(Diffie)和赫尔曼(Hellman)两人提出了公开密钥密码的新思想(论文"New Direction in Cryptography"),不仅加密算法本身可以公开,甚至加密用的密钥也可以公开。但这并不意味着保密程度的降低。因为如果加密密钥和解密密钥不一样。而将解密密钥保密就可以。这就是著名的公钥密码体制。也称作非对称密码体制。不同于对称性的 密码学, 在于其加密钥匙只适用于单一用户。



一把私有的钥匙,仅有用户才拥有。
一把公开的钥匙,可公开发行配送,只要有要求即取得。
每支钥匙产生一个被使用来改变属性的功能。私有的钥匙产生一个私有改变属性的功能,而公开的钥匙 产生一个 公开改变属性的功能。这些功能是反向相关的,例如,如果一个功能是用来加密消息,另外一个功能则被用来解密消息。不论此改变属性功能的次序为何皆不重要。公开的钥匙系统的优势是两个用户能够安全的沟通而不需交换秘密钥匙。例如,假设一个送信者需要传送一个信息给一个收信者,而信息的秘密性是必要的, 送信者以收信者的公开的钥匙来加密,而仅有收信者的私有的钥匙能够对此信息解密。公开的钥匙密码学是非常适合于提供认证,完整和不能否认的服务, 所有的这些服务即是我们所知的数字签名


除了加密外,公开钥匙密码学最显著的成就是实现了数字签名。数字签名,顾名思义,就是是普通签章的数字化,他们的特性都是某人可以轻易制造签章,但他人却难以仿冒。数字签名可以永久地与被签署信息结合,无法自信息上移除。数字签名大致包含两个算法:一个是签署,使用私密钥匙处理信息或信息的哈希值而产生签章;另一个是验证,使用公开钥匙验证签章的真实性。RSA和DSA是两种最流行的数字签名机制。数字签名是公开钥匙基础建设(public key infranstructures, PKI)以及许多网络安全机制(SSL/TLS, VPNs等)的基础。
公开钥匙算法大多基于计算复杂度上的难题,通常来自于数论。例如,RSA源于整数因子分解问题;DSA源于离散对数问题。发展快速的椭圆曲线密码学则基于和椭圆曲线相关的数学难题,与离散对数相当。由于这些底层的问题多涉及模数乘法或指数运算,相对于分组密码需要更多计算资源。因此,公开钥匙系统通常是复合式的,内含一个高效率的对称钥匙算法,用以加密信息,再以公开钥匙加密对称钥匙系统所使用的钥匙,以增进效率。

java中的使用RSA算法进行公钥加密私钥解密
分类: 数字签名 2008-01-01 23:19 8439人阅读 评论(9) 收藏 举报
加密算法javabytestring解密
一个比较简单的实现:一个三个类KeyGenerater生成公钥私钥对,Signaturer类使用私钥签名,SignProvider用公钥验证。公钥和私钥使用Base64加密Base64这个类也在博客里面

public class KeyGenerater {
private byte[] priKey;
private byte[] pubKey;

public void generater() {
  try {
   java.security.KeyPairGenerator keygen = java.security.KeyPairGenerator
     .getInstance("RSA");
   SecureRandom secrand = new SecureRandom();
   secrand.setSeed("syj".getBytes()); // 初始化随机产生器
   keygen.initialize(1024, secrand);
   KeyPair keys = keygen.genKeyPair();

   PublicKey pubkey = keys.getPublic();
   PrivateKey prikey = keys.getPrivate();

   pubKey = Base64.encodeToByte(pubkey.getEncoded());
   priKey = Base64.encodeToByte(prikey.getEncoded());

   System.out.println("pubKey = " + new String(pubKey));
   System.out.println("priKey = " + new String(priKey));
  } catch (java.lang.Exception e) {
   System.out.println("生成密钥对失败");
   e.printStackTrace();
  }
}

public byte[] getPriKey() {
  return priKey;
}

public byte[] getPubKey() {
  return pubKey;
}
}



public class Signaturer {
/**
  *
  * Description:数字签名
  *
  * @param priKeyText
  * @param plainText
  * @return
  * @author 孙钰佳
  * @since:2007-12-27 上午10:51:48
  */
public static byte[] sign(byte[] priKeyText, String plainText) {
  try {
   PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64
     .decode(priKeyText));
   KeyFactory keyf = KeyFactory.getInstance("RSA");
   PrivateKey prikey = keyf.generatePrivate(priPKCS8);

   // 用私钥对信息生成数字签名
   java.security.Signature signet = java.security.Signature
     .getInstance("MD5withRSA");
   signet.initSign(prikey);
   signet.update(plainText.getBytes());
   byte[] signed = Base64.encodeToByte(signet.sign());
   return signed;
  } catch (java.lang.Exception e) {
   System.out.println("签名失败");
   e.printStackTrace();
  }
  return null;
}
}

public class SignProvider {
private SignProvider() {

}

/**
  *
  * Description:校验数字签名,此方法不会抛出任务异常,成功返回true,失败返回false,要求全部参数不能为空
  *
  * @param pubKeyText
  *            公钥,base64编码
  * @param plainText
  *            明文
  * @param signTest
  *            数字签名的密文,base64编码
  * @return 校验成功返回true 失败返回false
  * @author 孙钰佳
  * @since:2007-12-27 上午09:33:55
  */
public static boolean verify(byte[] pubKeyText, String plainText,
   byte[] signText) {
  try {
   // 解密由base64编码的公钥,并构造X509EncodedKeySpec对象
   java.security.spec.X509EncodedKeySpec bobPubKeySpec = new java.security.spec.X509EncodedKeySpec(
     Base64.decode(pubKeyText));
   // RSA对称加密算法
   java.security.KeyFactory keyFactory = java.security.KeyFactory
     .getInstance("RSA");
   // 取公钥匙对象
   java.security.PublicKey pubKey = keyFactory
     .generatePublic(bobPubKeySpec);
   // 解密由base64编码的数字签名
   byte[] signed = Base64.decode(signText);
   java.security.Signature signatureChecker = java.security.Signature
     .getInstance("MD5withRSA");
   signatureChecker.initVerify(pubKey);
   signatureChecker.update(plainText.getBytes());
   // 验证签名是否正常
   if (signatureChecker.verify(signed))
    return true;
   else
    return false;
  } catch (Throwable e) {
   System.out.println("校验签名失败");
   e.printStackTrace();
   return false;
  }
}
}

分享到:
评论

相关推荐

    C# .net 使用Java公钥实现RSA加密

    C# .net 使用Java公钥实现RSA加密

    公钥密码学与RSA公钥密码学与RSA

    RSA(Rivest-Shamir-Adleman)是公钥密码学中最早也是最广泛使用的算法之一,它的发明者是Ron Rivest、Adi Shamir和Leonard Adleman。 公钥密码学的基本概念是,一对密钥,一个用于加密,另一个用于解密。与传统的...

    C#RSA私钥加密公钥解密

    私钥加密和公钥解密是RSA算法的核心特性,允许发送者使用接收者的公钥来加密数据,而只有持有对应私钥的接收者才能解密。在这个特定的案例中,`MyRSA.cs` 文件提供了一个实现,它使用了 `System.Numerics.BigInteger...

    公钥密码算法RSA的编写与优化

    接下来选择一个与φ(n)互质的整数e作为公钥的指数。最后,通过扩展欧几里得算法找出d,使得(e*d) % φ(n) = 1,d作为私钥的指数。 2. **加密过程**:发送方使用接收方的公钥(e, n)将明文m加密成密文c,计算公式为c=...

    Delphi RSA加解密【支持RSA公钥加密私钥解密,RSA私钥加密公钥解密,秘钥格式支持PKCS8和PKCS1】D7~XE10可用

    本文将详细讲解Delphi环境下如何实现RSA加解密,并着重讨论其支持的公钥加密私钥解密以及私钥加密公钥解密的功能,同时涉及PKCS8和PKCS1两种秘钥格式。 RSA是一种基于大数因子分解困难性的加密算法,由Ron Rivest、...

    rsa.zip_RSA 公钥加密_rsa_rsa私钥加密

    在这里,我们将深入探讨RSA加密算法的基本原理、加解密过程以及公钥与私钥的作用。 RSA算法由Ron Rivest、Adi Shamir和Leonard Adleman三位科学家在1977年提出,因此得名RSA。它的核心特点在于一对密钥,即公钥和...

    rsa.rar_RSA 公钥加密_rsa_rsa 私钥_公钥私钥

    文件列表中的"rsa"可能是指实现RSA算法的源代码文件或程序,可能包括了上述的公钥生成、私钥选取以及加密解密的函数。 理解RSA的工作原理和使用方法对于深入学习密码学和网络安全至关重要。然而,实际应用中,由于...

    C# .net版 RSA 公钥加密私钥解密 私钥加密公钥解密

    操作步骤与上述相反,使用私钥进行加密,公钥进行解密。 5. **注意事项**: - 加解密的数据长度受限于RSA密钥的大小,通常为密钥长度减去11位。因此,如果需要加密大量数据,通常会采用一种称为“密钥交换”的方式...

    公钥密码RSA算法C++实现

    RSA算法是公钥密码体制的典型代表,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。RSA算法基于大整数因子分解的困难性,即找到两个大素数的乘积很容易,但将这个乘积分解回它的素数因子却...

    c++实现的公钥密码算法RSA

    4. **证书**:RSA公钥常被用于X.509证书,验证服务器或用户的身份。 **总结** C++实现RSA公钥密码算法涉及到大数操作和数论知识,如素数生成、欧拉函数、模逆运算等。虽然RSA在现代密码学中占据重要地位,但随着...

    RSA.rar_C语言 RSA_RSA公钥 C语言_RSA的C语言实现_rsa_公钥密码rsa

    在这个“RSA.rar”压缩包中,我们很可能找到了一个C语言实现的RSA公钥加密算法的源代码,这对于理解RSA算法的底层工作原理和学习C语言编程都非常有帮助。 RSA算法是由Ron Rivest、Adi Shamir和Leonard Adleman在...

    Java公钥加密算法RSA.rar

    Java公钥加密算法RSA是一种广泛应用于网络通信中的安全技术,主要基于数学问题的难度来确保数据的安全性。RSA,由其发明者Ron Rivest、Adi Shamir和Leonard Adleman的名字首字母组成,是一种非对称加密算法,这意味...

    RSA.rar_RSA 公钥加密_rsa_rsa 公钥_加密解密 随机_私钥

    在这个“RSA.rar”压缩包中,包含了关于RSA算法的一些实践操作,如公钥和私钥的生成以及加密解密的示例。 首先,RSA的核心概念是基于大素数的乘积和欧拉函数。算法的基础是两个大素数p和q的乘积N=p*q,以及它们的...

    公钥密码:RSA密码算法源代码

    RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在美国麻省理工学院开发的。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将...

    linux下从公钥指数(Exponent)和模数(Modulus)得到RSA公钥和pem公钥文件

    在Linux环境下,生成RSA公钥和PEM公钥文件通常涉及到加密和安全领域的知识,特别是公钥基础设施(Public Key Infrastructure, PKI)中的RSA算法。RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard ...

    基于.net的RSA私钥加密 公钥解密的源码

    RSA的核心是两个密钥:公钥和私钥。公钥可以公开,任何人都可以获取,用于加密数据;而私钥必须保密,只有拥有者才能持有,用于解密数据。当一方使用对方的公钥加密数据后,只有持有对应私钥的一方才能解密,这确保...

    公钥加密算法RSA(java).rar

    **公钥加密算法RSA在Java中的实现** RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,广泛应用于网络安全领域,如数据加密、数字签名等。其核心概念是基于大数因子分解的困难性,使得只有拥有正确密钥的人才能...

    RSA公钥计算器,用于学习

    这有助于理解RSA算法的工作原理,因为用户可以看到公钥如何与特定的加密数据交互以恢复原始信息。 压缩包内的文件分别是: 1. RSA优化.ASM:这可能是一个用汇编语言编写的源代码文件,专门优化了RSA算法的实现,...

    RSA.rar_RSA公钥加密_rsa_信息安全_加密

    提供的"第二章 公钥加密和RSA 3.ppt"可能包含了对RSA加密算法的深入讲解,包括其数学基础、实现步骤以及实际应用案例,适合初学者了解和学习RSA。 **辅助学习资料** "www.pudn.com.txt"可能是链接或资料说明,可能...

    微信小程序RSA公钥加密模块

    (去掉注释13.6kb)微信小程序RSA加密模块,用法请参考文件里面的注释。 //加载RSA模块 var RSA = require('rsa.js'); var rsa_res = new RSA.RSAKey(); //配置公钥证书 let public_n = ''; let public_e = ''; ...

Global site tag (gtag.js) - Google Analytics