精华内容
下载资源
问答
  • 对称加密算法用来对敏感数据等信息进行加密,常用算法包括DES、3DES、AES、DESX、Blowfish、、RC4、RC5、RC6。  DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据场合。 3DES...

    一、对称加密算法 

         指加密和解密使用相同密钥的加密算法。对称加密算法用来对敏感数据等信息进行加密,常用的算法包括DES、3DES、AES、DESX、Blowfish、、RC4、RC5、RC6。

         DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。
         3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。
         AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高;

                                     

     

    二、非对称加密算法

          指加密和解密使用不同密钥的加密算法,也称为公私钥加密。假设两个用户要加密交换数据,双方交换公钥,使用时一方用对方的公钥加密,另一方即可用自己的私钥解密。常见的非对称加密算法:RSA、DSA(数字签名用)、ECC(移动设备用)、Diffie-Hellman、El Gamal。

            RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;
            DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准);
            ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。

       ECC和RSA相比,在许多方面都有对绝对的优势,主要体现在以下方面:
    (1)抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。
    (2)计算量小,处理速度快。ECC总的速度比RSA、DSA要快得多。
    (3)存储空间占用小。ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。
    (4)带宽要求低。当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。

     

    三、散列算法(Hash算法---单向加密算法)
           散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。

           Hash算法:特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。

    单向散列函数一般用于产生消息摘要,密钥加密等,常见的Hash算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1。

           MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,非可逆,相同的明文产生相同的密文。
           SHA(Secure Hash Algorithm):可以对任意长度的数据运算生成一个160位的数值;

           SHA-1与MD5的比较
    因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:
    (1)对强行供给的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^(128)数量级的操作,而对SHA-1则是2^(160)数量级的操作。这样,SHA-1对强行攻击有更大的强度。
    (2)对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
    速度:在相同的硬件上,SHA-1的运行速度比MD5慢。

     

    四、 加密算法的选择

    1.由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。
    2.对称加密算法不能实现签名,因此签名只能非对称算法。
    3.由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。
    4.在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
     

             那采用多少位的密钥呢?

             RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。

    展开全文
  • 对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂加密密文发送出去。常用对称加密算法:AES,RC4,3DES传输示意图如下所示:如上图所示,此种...
    第一 对称加密:
    对称加密是指,加密方和解密方使用同样的秘钥来进行加密和解密。
    在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。常用的对称加密算法:AES,RC4,3DES

    传输的示意图如下所示:

    如上图所示,此种方式属于对称加密,双方拥有相同的密钥,信息得到安全传输,但此种方式的缺点是:

    (1)不同的客户端、服务器数量庞大,所以双方都需要维护大量的密钥,维护成本很高

    (2)因每个客户端、服务器的安全级别不同,密钥极易泄露

    这里举例一个使用DES算法来实现对称加密的例子:

    public class DESUtils {

    public byte[] initKey(){
    try {
    KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
    keyGenerator.init(56);
    SecretKey secretKey = keyGenerator.generateKey();
    return  secretKey.getEncoded();
    } catch (NoSuchAlgorithmException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    return null;
    }

    /**
      * @Method: encrypt
      * @Description: 加密算法
      * @param data 被加密字节数组
      * @param key  随机对称密钥
      * @return
      * 返回类型:byte[]
      */
    public byte[] encrypt(byte[] data,byte[] key){
    SecretKey secretKey = new SecretKeySpec(key, "DES");
    Cipher cipher;
    try {
    cipher = Cipher.getInstance("DES");
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    return cipher.doFinal(data);
    } catch (Exception e) {
    e.printStackTrace();


    return null;
    }

    /**
      * @Method: decode
      * @Description: TODO
      * @param 被解密的字节数组
      * @param key 随机对称密钥(和加密密钥务必保持一致)
      * @return
      * 返回类型:byte[]
      */
    public byte[] decode(byte[] data,byte[] key){
    SecretKey secretKey = new SecretKeySpec(key, "DES");
    Cipher cipher;
    try {
    cipher = Cipher.getInstance("DES");
    cipher.init(Cipher.DECRYPT_MODE, secretKey);
    return cipher.doFinal(data);
    } catch (Exception e) {
    e.printStackTrace();


    return null;
    }

    测试代码为:

    public static void testDes(){
    DESUtils desUtils = new DESUtils();
    byte[] key = desUtils.initKey();   // 
    String originData = "123456";
    System.out.println("原始数据:"+originData);
    try {
    // 将原始数据转化为字符串
    byte[] arrayOrigin = originData.getBytes("utf-8");
    // 对原始数据进行加密
    byte[] encryption = desUtils.encrypt(arrayOrigin, key);
    // 通过BASE64Encoder转化处理
    String encryptionStr = new BASE64Encoder().encode(encryption);
    System.out.println("经过加密之后的字符串:"+encryptionStr);

    try {
    // 使用BASE64Decoder进行转化处理
    byte[] decoceOrigin = new BASE64Decoder().decodeBuffer(encryptionStr);
    // 使用DES进行解密操作
    byte[] decode = desUtils.decode(decoceOrigin, key);
    // 把字节数组转化为字符串
    String decodeStr = new String(decode,"utf-8");
    System.out.println("对加密字符串进行解密:"+decodeStr);
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }

    运行结果如下:

    原始数据:123456
    经过加密之后的字符串:jaKOVkHJtOQ=
    对加密字符串进行解密:123456

    第二 、非对称加密:
    非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。非对称加密算法:RSA,DSA/DSS 

    如上图所示,客户端用公钥对请求内容加密,服务器使用私钥对内容解密,反之亦然,但上述过程也存在缺点:

    公钥是公开的(也就是黑客也会有公钥),所以第 ④ 步私钥加密的信息,如果被黑客截获,其可以使用公钥进行解密,获取其中的内容。

    实现非对称加密算法例子:

    public class AsymmetricEncryption {


    public static final String KEY_ALGORITHM = "RSA";
    /** 貌似默认是RSA/NONE/PKCS1Padding,未验证 */
    public static final String CIPHER_ALGORITHM = "RSA/ECB/PKCS1Padding";
    public static final String PUBLIC_KEY = "publicKey";
    public static final String PRIVATE_KEY = "privateKey";


    /** RSA密钥长度必须是64的倍数,在512~65536之间。默认是1024 */
    public static final int KEY_SIZE = 2048;


    public static final String PLAIN_TEXT = "hello world!";


    /**
    * @Method: generateKeyBytes
    * @Description: 首先产生一个公钥和私钥对,使用HashMap保存起来
    * @return 返回类型:Map<String,byte[]>
    */
    public static Map<String, byte[]> generateKeyBytes() {


    try {
    KeyPairGenerator keyPairGenerator = KeyPairGenerator
    .getInstance(KEY_ALGORITHM);
    keyPairGenerator.initialize(KEY_SIZE);
    KeyPair keyPair = keyPairGenerator.generateKeyPair();


    RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
    RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();


    Map<String, byte[]> keyMap = new HashMap<String, byte[]>();
    keyMap.put(PUBLIC_KEY, publicKey.getEncoded());
    keyMap.put(PRIVATE_KEY, privateKey.getEncoded());
    return keyMap;
    } catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
    }
    return null;
    }


    /**
    * 还原公钥,X509EncodedKeySpec 用于构建公钥的规范

    * @param keyBytes
    * @return
    */
    public static PublicKey restorePublicKey(byte[] keyBytes) {
    X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);


    try {
    KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);
    PublicKey publicKey = factory.generatePublic(x509EncodedKeySpec);
    return publicKey;
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }


    /**
    * 还原私钥,PKCS8EncodedKeySpec 用于构建私钥的规范

    * @param keyBytes
    * @return
    */
    public static PrivateKey restorePrivateKey(byte[] keyBytes) {
    PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(
    keyBytes);
    try {
    KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);
    PrivateKey privateKey = factory
    .generatePrivate(pkcs8EncodedKeySpec);
    return privateKey;
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }


    /**
    * 加密,三步走。

    * @param key
    * @param plainText
    * @return
    */
    public static byte[] RSAEncode(PublicKey key, byte[] plainText) {


    try {
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
    cipher.init(Cipher.ENCRYPT_MODE, key);
    return cipher.doFinal(plainText);
    } catch (Exception e) {
    e.printStackTrace();
    }


    return null;
    }


    public static String RSADecode(PrivateKey key, byte[] encodedText) {


    try {
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
    cipher.init(Cipher.DECRYPT_MODE, key);
    return new String(cipher.doFinal(encodedText));
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }

    }

    测试代码如下:

    public static void tesRSA(){
    Map<String, byte[]> keyMap = AsymmetricEncryption.generateKeyBytes();

    // 加密
    PublicKey publicKey = AsymmetricEncryption.restorePublicKey(keyMap.get(AsymmetricEncryption.PUBLIC_KEY));
    byte[] encodedText = AsymmetricEncryption.RSAEncode(publicKey, AsymmetricEncryption.PLAIN_TEXT.getBytes());
    String rsaString = new BASE64Encoder().encode(encodedText);
    System.out.println("RSA encoded: " + rsaString);

    PrivateKey privateKey = AsymmetricEncryption.restorePrivateKey(keyMap.get(AsymmetricEncryption.PRIVATE_KEY));
    System.out.println("RSA decoded: "+ AsymmetricEncryption.RSADecode(privateKey, encodedText));

    }

    运行结果如下所示:

    RSA encoded: e7wIyV32VtiJhiraQGIYxD2TKtC4O6dRJx0lgVuEUsjCTSjqNFmEVNlYmFzd3ohIiW67XyIfEzWD
    W9YFpFnDekRFLgeerh7c5gXMLVsVkf7k7XuTbiGmQOlOBUmL8VWpWVWTk8Rgn7Y+G7/dz9+DOEnH
    csMnssKC/MBM80Ad5Za+QHqgb6BdZNHjZYzWpDIztBEUf/yHWfkGhmJahxo6Ff6y8er/shiP+qL3
    hMJlw70TTGoGlrAWQqxUMYGPrv4IELi/iNSednXxo5bNNatJYke7FhKnuy8GEOWNH/K8Q52vl24L
    cururJGLEJR6Hn/oaGxnXQbs2Fzo3vUziDj1cQ==
    RSA decoded: hello world!

    第三 非对称和对称完美结合

    非对称加密既然也有缺陷,那我们就将对称加密,非对称加密两者结合起来,取其精华、去其糟粕,发挥两者的各自的优势:


    如上图所示

    (1)第 ③ 步时,客户端说:(咱们后续回话采用对称加密吧,这是对称加密的算法和对称密钥)这段话用公钥进行加密,然后传给服务器

    (2)服务器收到信息后,用私钥解密,提取出对称加密算法和对称密钥后,服务器说:(好的)对称密钥加密

    (3)后续两者之间信息的传输就可以使用对称加密的方式了

    这是个非常非常经典的数据传输过程,也是Https传输协议里面最经典的部分。也是把对称加密和非对称加密的作用发挥到了很好的地方。在https传输的过程中,如果单独只用对称加密,或者单独使用非对称加密都会出现问题。



    展开全文
  • 非对称加密,与对称加密算法有所不同,非对称加密算法需要两个密钥,即公开密钥和私有密钥,非对称加密算法在加密和解密过程使用了不同密钥,非对称密钥也称为公钥加密,在密钥对,其中一个密钥对外公开...

    非对称加密,与对称加密的算法是有所不同的,非对称加密算法需要两个密钥,即公开密钥和私有密钥,非对称加密算法在加密和解密过程使用了不同的密钥,非对称密钥也称为公钥加密,在密钥对中,其中一个密钥是对外公开的,所有人都可以获取,称为公钥;另外一个密钥是不公开的,称为私钥

    加密算法一般分为对称加密和非对称加密,非对称加密是指为满足安全性需求和所有权验证需求而集成到区块链中的加密技术。非对称加密通常在加密和解密过程中使用两个非对称的密码,分别称为公钥和私钥。非对称密钥对具有两个特点:一是用其中一个密钥(公钥或私钥)加密信息后,只有另一个对应的密钥才能解开;二是公钥可向其他人公开,私钥则保密,其他人无法通过该公钥推算出相应的私钥。

    非对称加密一般划分为三类主要方式:大整数分解问题类、离散对数问题类、椭圆曲线类。大整数分解问题类指用两个较大的质数的乘积作为加密数,由于质数的出现具有不规律性,想要破解只能通过不断试算。离散对数问题类指的是基于离散对数的难解性,利用强的单向散列函数的一种非对称分布式加密算法。椭圆曲线类指利用平面椭圆曲线来计算成组非对称恃殊值,比特币就使用此类加密算法。

    非对称加密技术在区块链的应用场景主要包括信息加密、数字签名和登录认证等。其中信息加密场景主要是由信息发送者(记为A)使用接受者(记为B)的公钥对信息加密后再发送给B,B利用自己的私钥对信息解密。比特币交易的加密即属于此场景。数字签名场景则是由发送者A采用自己的私钥加密信息后发送给B,再由B使用A的公钥对信息解密,从而可确保信息是由A发送的。登录认证场景则是由客户端使用私钥加密登录信息后发送给服务器,后者接收后采用该客户端的公钥解密并认证登录信息。

    存储在区块链上的交易信息是公开的,但是账户身份信息是高度 加密的,只有在数据拥有者授权的情况下才能访问,从而保证了数据 的安全和个人的隐私。区块链系统每个用户都有一对秘钥,一个是公 开的,一个是私有的。通常公钥的密码算法采用的是椭圆曲线算法。 用户可以通过自己的私钥对交易进行签名,同时別的用户可以利用签 名用户的公钥对签名进行验证。

    椭圆曲线指的是由韦尔斯特拉斯(Weierstrass)方程y2+a1xy +a3y=x3+a2x2+a4x+a6所确定的平面曲线。若F是一个域,blob.pngi=1,2 ,...,6。满足式(1-1 )的数偶(x , y )称为F域上的椭圆曲线E的点。F域可以是有理数域,还可以是有限域GF ( Pr )。椭圆曲 线通常用E表示。除了曲线E的所有点外,尚需加上一个叫作无穷远 点的特殊点〇。在椭圆曲线加密(ECC )中,利用了某种恃殊形式的 椭圆曲线,即定义在有限域上的椭圆曲线。其方程如下:

    blob.png

    这里p是素数,a和b为两个小于p的非负整数,它们满足:

    blob.png

    其中,x,y,a,blob.png,则满足式(1-2 )的点(x , y )和—个 无穷点〇就组成了椭圆曲线E。

    椭圆曲线离散对数问题BCDLP定义如下:给定素数p和椭圆曲线E ,对Q=kP ,在已知P,Q的情况下求出小于P的正整数k。可以证已知k和P计算Q比较容易,而由Q和p计算卩则比较困难,至今没有有效的方法来解决这个问题,这就是椭圆曲线加密算法原理之所在。与RSA算法相比,椭圆曲线公钥系统是代替RSA的强有力的竞争者。椭圆曲线加密方法的优点总结如下:

    ·安全性能更高,如160位ECC与1024位RSA、DSA有相同的安全强度。

    ·计算量小,处理速度快,在私钥的处理速度上(解密和签名),ECC远比RSA、DSA快得多。

    ·存储空间占用小,ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,所以占用的存储空间小得多。

    ·带宽要求低,使得ECC具有广泛的应用前景。

    ECC的这些特点使它必将取代RSA,成为通用的公钥加密算法。比如SET协议的制定者已把它作为下一代SET协议中缺省的公钥密码算法。

    利用椭圆曲线的签名和验证算法,可以保证账号的唯一性和不可冒名顶替性,同时也保证了用户的不可抵赖性。通过这些密码学技术的应用可以使得区块链技术在没有中心服务器的情况下做到数据的不可逆和不可篡改。

    展开全文
  • *本文只讨论一个问题,在非对称加密算法RSA中,什么公钥什么私钥 非对称加密算法对称加密算法有很多,例如RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。 在在这些算法中,RSA最为常用,...

    *本文只讨论一个问题,在非对称加密算法RSA中,什么是公钥什么是私钥

    非对称加密算法

    非对称加密算法有很多,例如RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。

    在在这些算法中,RSA最为常用,因此,在没有特殊说明的情况下,常说的公钥、私钥都指的的RAS的公钥、私钥。

    这里也是以RSA算法为例,来讨论非对称加密中的公钥和私钥

    RSA加密算法

    要想了解公钥和私钥的区别,就要从它们的产生开始。
    这里我默认读者已经了解了RSA算法。如果还不了解,请先去看这两篇文章。
    RSA算法原理(一)
    RSA算法原理(二)
    特别是 RSA算法原理(二)一定要仔细看一遍,不然下面的内容你将看不懂。

    RSA加密算法中的公钥和私钥

    看过上面两篇文章的人应该已经知道了,在RSA加密算法中有6个非常关键数字,他们是算法的核心。
    这6个数字分别是

    • 大质数p
    • 另一个大质数q
    • p和q的乘积n
    • n的欧拉函数φ(n)  注:φ(n) = (p-1)(q-1)
    • 一个随机整数e,1< e < φ(n),且e与φ(n) 互质
    • e对于φ(n)的模反元素d  注:所谓"模反元素"就是指有一个整数d,可以使得ed被φ(n)除的余数为1。

    其中(n,e)在一起组成了公钥,(n,d)在一起组成了私钥。

    现在让我们来回答最开始提出是问题,什么是公钥,什么是私钥。
    答:公钥为(n,e) 私钥为(n,d)

    文章到此结束,谢谢大家的阅读!

    番外1

    其实我们仔细想想就会发现,(n,e) 和 (n,d) 根本没什么区别。为什么一个叫公钥一个叫私钥呢?反过来行不行?

    答案是可以的,根据算法原理我们知道,只有 (n,e) 是算不出 (n,d) 的,反过来只有 (n,d) 也是算不出 (n,e) 的。所以反过来也是安全的。

    那我们就不经思考了,既然反过来也可以,那公钥私钥还有什么区别,为什么一个叫公钥,一个叫私钥呢。

    我想了很久,最终想到了一个合理的解释,被公开的秘钥就叫公钥,没有被公开的秘钥就叫私钥。网上多数的回答也证实了我的想法。

    原来 公钥和私钥并不是根据 (n,e) 和 (n,d) 区分的,而是根据使用上的不同来区分的

    番外2

    让我们再思考一个问题。
    在工作中,我们经常会用到各种生成秘钥的工具。这些工具一般会为我们生成两个文件。一个公钥文件,假设叫public.key。一个私钥文件,假设叫private.key。

    根据上文的结论,我们是否能将private.key当做公钥公开,将public.key当做私钥,保留呢?

    答案是 不可以!!!大家千万别去这么做!

    为什么,按照上文的结论 “被公开的秘钥就叫公钥,未被公开的秘钥就叫私钥”,不应该是可以吗?为什么不可以?

    除非,上面的结论是错的!!!

    是的,上面的结论是错的,公钥和私钥并不是根据使用上的不同来区分的,也不是根据(n,e) 和 (n,d) 来区分的。

    那公钥和私钥是通过什么来区分的,到底有没有区别。
    别着急,让我们先来看一个有趣的现象

    根据私钥推导出公钥

    在一些秘钥生成工具中,有一个功能叫做 根据私钥推导出公钥 ,这个功能可以根据私钥文件,推导出公钥文件来。 比如蚂蚁金服的秘钥生成工具

    学习了RSA算法原理的人肯定想说,这不可能,不管私钥是(n,d)还是(n,e) ,只有 (n,e) 是算不出 (n,d) 的,只有 (n,d) 也是算不出 (n,e) 的。

    难道是阿里的人太nb了,可以算出来吗?

    当然不是!要真是这样,这种加密算法就不安全了。

    那这个功能是怎么实现的了!
    答案是私钥中包含了公钥信息!!!

    私钥中包含公钥信息

    让我们做个实验,随便用什么秘钥生成工具,生成一对秘钥,然后以文本的方式打开,你会发现,私钥的内容总是比公钥的多! 再仔细观察你会发现 公钥中的部分内容在私钥中也存在!

    这里最好用文本对比工具,这样看的比较清楚,我知道你们懒得去动手,所以我帮你们做好了!

    左边是公钥的内容,右边是私钥的内容,可以看到中间有一行内容是一样的!

    为什么会这样, 公钥难道不是(n,e) 私钥难道不是(n,d) 吗!


    按照RSA算法的定义,公钥确实是(n,e) 私钥也确实的(n,d)。

    但是,实际应用中,人们发现,这样做的话,公钥和私钥的重要性和地位就一样了,但其实我们最关心的是私钥,私钥才是最重要的。

    于是
    在pkcs标准中,pkcs#1规定,私钥包含(n,e,d,p,q),公钥包含(n,e)
    在pkcs标准中,pkcs#1规定,私钥包含(n,e,d,p,q),公钥包含(n,e)
    在pkcs标准中,pkcs#1规定,私钥包含(n,e,d,p,q),公钥包含(n,e)

    重要的话说三遍

    (pkcs全称Public-Key Cryptography Standards (公开秘钥加密标准),旗下包含十几个子标准,每个子标准负责一个领域。)

    这样做有两个好处

    1. 公钥和私钥的重要性和地位不再一样,私钥的重要性和地位远高于公钥,这有利于私钥的持有者。
    2. 拥有了私钥,就相当于拥有了公钥,使用起来特别方便,就算公钥弄丢了,还可以通过私钥生成出来。

    (从上文我们了解到,理论和实现还是有区别的,理论跟偏向原理,而实现更偏向使用,所以实际中的私钥会比理论中的私钥多几个参数。)


    现在我们可以回答最开始提出的问题了,在非对称加密算法RSA中,什么是公钥什么是私钥。

    1. 公钥首先是一种秘钥,它包含(n,e),可以被公开,不能推导出私钥
    2. 私钥首先也是一种秘钥,他有两种语法格式,pkcs#8标准语法格式的和pkcs#1标准语法格式,其中pkcs#1规定,私钥包含(n,e,d,p,q),不可以被公开,可以推导出公钥。

    在实际应用中,绝大多数对RSA的实现,都遵循pkcs的标准,即私钥能推出公钥,但公钥不能推出私钥

    总结

    通过上面的文章我们至少要知道以下几点

    • 公钥和私钥不一样
    • 私钥可以推导出公钥,但公钥无法推导出私钥(私钥包含公钥)
    • 理论和实现 是有出入的,所以只学习理论是无法为我们解惑的,必须联系实际进行思考才能解答我们的疑问。

    番外3

    秘钥格式

    生成的秘钥一般会通过PEM编码成文本来存储。具体如下:

    • PKCS1语法格式私钥:传统格式,PHP、.NET一般使用此格式
    • PKCS8语法格式私钥:java一般使用此格式
    • PKCS1格式和PKCS8格式的私钥,导出的公钥内容是一摸一样的

    公钥是不分 pkcs1 格式和 pkcs8格式的,因为公钥就只有一种语法格式。

    RSA密钥语法

    RSA公钥在PKCS#1标准中定义的语法

    RSAPublicKey ::= SEQUENCE {
        modulus           INTEGER,  -- n
        publicExponent    INTEGER   -- e
    }
    (n,e)
    复制代码

    RSA私钥在PKCS#1标准中定义的语法

    RSAPrivateKey ::= SEQUENCE { 
    version	Version,	//版本 
    modulus	INTEGER,	// RSA合数模 n 
    publicExponent	INTEGER,	//RSA公开幂 e 
    privateExponent	INTEGER,	//RSA私有幂 d 
    prime1	INTEGER,	//n的素数因子p 
    prime2	INTEGER,	//n的素数因子q 
    exponent1	INTEGER,	//值 d mod (p-1) 
    exponent2	INTEGER,	//值 d mod (q-1) 
    coefficient	INTEGER,	//CRT系数 (inverse of q) mod p 
    otherPrimeInfos	OtherPrimeInfos OPTIONAL 
    }
    (n,e,d,p,q)
    复制代码

    RSA私钥在PKCS#8标准中定义的语法

    pkcs#8 全称 Private-Key Information Syntax Standard 私钥信息语法标准,是专门为私钥而设计的规范,所以是不存在PKCS#8格式的公钥这一说

    PrivateKeyInfo ::= SEQUENCE {  
    version	Version,	//版本 
    privateKeyAlgorithm	PrivateKeyAlgorithmIdentifier, 	//算法标示符 
    privateKey	PrivateKey,  //私钥
    attributes		[0]  IMPLICIT Attributes OPTIONAL 
    } 
    复制代码

    转载于:https://juejin.im/post/5b135ac36fb9a01e2d702eaf

    展开全文
  • java 加密之对称加密算法

    千次阅读 2017-02-27 16:50:03
    对称加密算法中,数据发送方将明文和加密密钥一起经过算法处理后,使其变成复杂密文发送出去。接收方收到密文后,若想解读原文,则需要使用加密用过密钥及相同算法逆算法对密文进行解密,才能使其恢复成可读...
  • 对称加密算法基本概念

    千次阅读 2015-05-03 11:42:16
    在使用github、ssh等工具时,需要生成密钥对,只知道这个密钥对是用来做认证用的,但对为何要生成...加密是指把明文转换成密文的过程,密钥是加密过程中的可变参数,加密算法可以分为对称加密算法和非对称加密算法两大
  • 对称加密算法,加密与解密密钥一样,密钥管理比较困难,容易泄露,一旦泄露就会很容易导致数据不安全。 相关概念 明文: 数据没有进行加密,原始数据信息。 密文: 加密过后得到数据, 隐藏了原始数据含义...
  • 目录 一、非对称加密  1、什么是非对称加密?  2、非对称加密的工作过程  3、非对称加密的优点 ... 4、非对称加密的不足 ...二、RSA加密算法 ...非对称加密是指,需要用一对儿密钥,即公钥和私钥,来完成加...
  • 散列函数 或散列算法,又称哈希函数,英语:Hash Function)一种从任何一种数据...加密和解密使用相同密钥的加密算法。 常用算法有:DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和AES 非对称加密 加密和解密...
  • RSA 1024 是指公钥及私钥分别是 1024bit,也就是 1024...1、非对称加密算法中 1024bit 密钥强度相当于对称加密算法 80bit 密钥强度;   2、密钥长度增长一倍,公钥操作所需时间增加约 4 倍,私钥操作所需时间...
  • 对称加密和非对称加密 对称加密 对称加密指的就是加密和解密使用同一个秘钥,所以叫做...对称加密算法相比非对称加密算法来说,加解密效率要高得多。但是缺陷在于对于秘钥管理上,以及在非安全信道通讯时,密
  • 什么是对称加密

    万次阅读 2019-05-15 18:37:29
    对称加密,也叫私钥加密,是指加密和解密使用相同密钥的加密算法。有时也叫作传统密码算法,就是加密秘钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。但是,在大多数的对称算法中,加密密钥...
  • 加密算法

    2021-01-08 05:52:24
    文章有参考整理其他一些有价值博客以及官方文档内容,如有侵权请联系删除。 文章目录加密和解密对称加密算法对称加密算法散列...对称加密算法是指加密和解密采用相同密钥,是可逆(即可解密)。它是应用较
  • 1. 对称加密 对称加密指的就是加密和解密使用同一个秘钥,所以叫做...对称加密算法相比非对称加密算法来说,加解密效率要高得多。但是缺陷在于对于秘钥管理上,以及在非安全信道通讯时,密钥交换安全性不能保障
  • 而在大多数的对称算法中,加密密钥和解密密钥相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人...
  • 对称加密rsa算法

    2020-02-20 10:29:04
    这对密钥中的公钥进行加密,私钥用于解密。反之亦然(被私钥加密的数据也可以被公钥解密) 。 在实际使用中私钥一般保存在发布者手中,私有的不对外公开的,只将公钥对外公布,就能实现只有私钥的持有者才能将数据...
  • 但是对于其原理大部分同学应该都一知半解,今天就来分析下经典对称加密算法 - RSA算法。 通过本文分析,可以更好理解非对称加密原理,可以让我们更好使用非对称加密技术。题外话: 并博客一直有打算写...
  • 而在大多数的对称算法中,加密密钥和解密密钥相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人...
  • 而在大多数的对称算法中,加密密钥和解密密钥相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人...
  • 常见的加密算法

    2019-06-07 17:37:04
    对称加密算法是指加密和解密采用相同的密钥,是可逆的,即可以解密。 常见对称加密算法包括:AES,DES,3DES。 AES加密算法是密码学中的高级加密标准,采用的是对称分组密码体制,密钥长度的最少支持为128。 DES加密...
  • 对称加密

    2020-08-27 13:55:44
    而在大多数的对称算法中,加密密钥和解密密钥相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人...
  • 1.对称加密算法 ...本文主要讲解的是对称加密算法和非对称加密算法。对称和非对称指的是加密密钥和解密密钥。如果加密密钥和解密密钥相同,则称为对称,反之为非对称。 1.对称加密算法 发...
  • 又称质数,在一个大于1自然数,除了1和此整数自身外,不能被其他自然数整除数。 互质 又称互素。若N个整数最大公因子1,则称这N个整数互质。 模运算即求余运算 “模”“Mod”音译。和模运算紧密...
  • 想学习更多区块链知识,请...但是对于其原理大部分同学应该都一知半解,今天就来分析下经典对称加密算法 - RSA算法。通过本文分析,可以更好理解非对称加密原理,可以让我们更好使用非对称加密技术...
  • SSL基于TCP和其他应用层协议提供可靠连接安全保障 主要实现工作是:数据加密、身份验证、消息...所谓加密通道,是指发送方在发送数据前,使用加密算法和加密密钥对数据进行加密,然后将数据发送给对方。接...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 262
精华内容 104
关键字:

对称加密算法中的对称是指