Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >支付项目中常用的加密解密算法一文讲透

支付项目中常用的加密解密算法一文讲透

作者头像
用户3587585
发布于 2024-04-30 09:37:30
发布于 2024-04-30 09:37:30
1.3K00
代码可运行
举报
文章被收录于专栏:阿福谈Web编程阿福谈Web编程
运行总次数:0
代码可运行
前言

作为支付机构,传输的数据大多是非常隐私的,比如身份证号、银行卡号、银行卡密码等。一旦这些信息被不法分子截获,就可能直接被盗刷银行卡,给消费者造成巨大损失。如果不法分子获取的信息是加密的,且没有解密的秘钥,那么对于不法分子来说这些信息就是一堆乱码,这就是加码最重要的意义。

目前最重用的加密、解密算法主要有两类:对称加密算法非对称加密算法。两者的主要区别在于加密和解密的秘钥是否一致,一致就是对称加密,不一致就是非对称加密。对称加密常用的是AES加密算法,非对称加密算法常用的是RSA加密算法,下面分别介绍 RSA 加密算法和AES加密算法在支付项目中的应用。

RSA 是一种非对称加密算法,可以在不传递秘钥的情况下完成解密,避免了对称加密直接传递秘钥造成被破解的 风险。RSA 加密/解密由一对由公钥私钥组成的秘钥共同完成加密和解密,公钥是公开的,用来加密,私钥是保密的,用来解密。两者之间通过一定的算法关联,最核心的思想是利用一对极大整数做因数分解的困难性来保证安全。

RSA 加密过程

假设甲是支付机构,乙是支付机构的商户,甲乙之间需要进行数据的传输。如果要对数据进行加密/解密,则要先生成密钥:甲生成一对秘钥(公钥和私钥),公钥给乙,私钥自己保留;同样乙也生成一对公私钥,公钥给甲,私钥留给自己。具体过程如下图所示:

有了秘钥之后就可以对传输的数据进行加密了。数据传输是双向的,所以支付行业数据的加密/解密也是双向的,具体步骤如下:

1)乙使用甲的公钥加密要传输的数据,并把加密后的数据上送给甲;

2)甲收到乙传来的加密数据,使用自己的私钥解密;

3)甲将处理后的数据使用乙的公钥进行加密后返回给乙;

4)乙接受返回的数据,并使用自己的私钥解密。

以上步骤是一个支付机构一个比较标准的加密/解密流程,甲乙双方分别使用对方的公钥加密,然后使用自己的私钥解密,具体流程如下图所示:

RSA 算法加密/解密示例

JDK 已经封装好了 RSA 加密/解密的方法,如果要对数据加密/解密,则需要先生成一对秘钥。生成密钥的代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package org.sang.utils;

import java.security.*;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

public class keyPairGenUtil {
    // 秘钥大小
    public static int KEY_LENGTH = 1024; 
    // 算法类型
    public static String ALGORITHM_TYPE = "RSA"; 
     
    public static Map<String, String> genkeyPair() throws NoSuchAlgorithmException {
        // 存储公钥和私钥
        Map<String, String> keyPairMap = new HashMap<>();
        // 为 RSA 算法创建keyPairGenerator 对象
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM_TYPE);
        // 创建可信任的随机数源
        SecureRandom secureRandom = new SecureRandom();
        // 使用随机数据源初始化keyPairGenerator 对象
        keyPairGenerator.initialize(KEY_LENGTH, secureRandom);
        // 生成密钥对
        KeyPair keypair = keyPairGenerator.generateKeyPair();
        // 获取公钥
        PublicKey publicKey = keypair.getPublic();
        // 获取私钥
        PrivateKey privateKey = keypair.getPrivate();
        // 使用 Base64 将公钥和私钥转化为字符串
        String publicKeyStr = Base64.getEncoder().encodeToString(publicKey.getEncoded());
        String privateKeyStr = Base64.getEncoder().encodeToString(privateKey.getEncoded());
        keyPairMap.put("publicKey", publicKeyStr);
        keyPairMap.put("privateKey", privateKeyStr);
        return keyPairMap;
    }
    
}

生成公钥和私钥之后就可以加密解密了,加密/解密的示例如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package org.sang.utils;

import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

public class RSAUtil {

    public static String encrypt(String data, String publicKey) throws Exception {
        // 使用Base64 编码的公钥解析为二进制
        byte[] publicKeyByte = Base64.getDecoder().decode(publicKey);
        // 得到公钥
        PublicKey pubKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyByte));
        // 加密数据
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
        // 得到加密后的数据
        return Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes()));
    }

    public static String decrypt(String data, String privateKey) throws Exception{
        // 将 Base64 编码的私钥解析为二进制
        byte[] privateKeyByte = Base64.getDecoder().decode(privateKey);
        // 使用 Base64 解析后得到的加密数据
        byte[] dataByte = Base64.getDecoder().decode(data.getBytes());
        // 获取私钥
        PrivateKey priKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(privateKeyByte));
        // RSA 解密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, priKey);
        // 得到解密后的数据
        return new String(cipher.doFinal(dataByte));
    }
}
RSA 算法加密/解密测试

然后写一个测试类完成生成公私钥并对银行转账数据进行加密和解密的测试方法,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package org.sang.test;

import org.sang.utils.KeyPairGenUtil;
import org.sang.utils.RSAUtil;

import java.util.Map;

public class RSATest {

    public static void main(String[] args) throws Exception {
        Map<String, String> keyPairMap = KeyPairGenUtil.genkeyPair();
        String publicKey = keyPairMap.get("publicKey");
        System.out.println("publicKey="+publicKey);
        String privateKey = keyPairMap.get("privateKey");
        System.out.println("privateKey="+privateKey);
        String jsonData = "{\"fromCardNum\": \"622135689832498329\", \"payAmount\": 1000.00, \"toCardNum\": \"623269874369721685\"}";
        // 加密开始时间戳
        long encryptStartTime = System.currentTimeMillis();
        String encryptData = RSAUtil.encrypt(jsonData, publicKey);
        // 解密结束时间戳
        long encryptEndTime = System.currentTimeMillis();
        System.out.println("RSA算法加密耗时:"+(encryptEndTime-encryptStartTime)+"ms");
        System.out.println("encryptData="+encryptData);
        // 解密开始时间戳
        long decryptStartTime = System.currentTimeMillis();
        String decryptData = RSAUtil.decrypt(encryptData, privateKey);
        // 解密结束时间戳
        long decryptEndTime = System.currentTimeMillis();
        System.out.println("解密耗时:"+(decryptEndTime-decryptStartTime)+"ms");
        System.out.println("decryptData="+decryptData);
    }
}

运行 RSATest 类中的 main 方法,可以看到控制台中成功打印出公钥、私钥以及加密数据和解密数据,由此说明我们写的生成公私钥和 `RSA`算法加密解密工具方法是没有问题的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
publicKey=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCcy+2sKc+lTYrFe4RuiNWc62VAPtueoPDFP3UzCmhBp+zbTRR5U6uXeGEmQrKzTrFCH2yoDoKaxdFOfnjmV94zrc54WUpTWI5XXOgSBrmFhJBqoBgkRDv7M3oNw5FHnGWXJZ+ydk3fZVrcvw5qJDucAkG90/JvAW+kwL0PuI//3wIDAQAB
privateKey=MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJzL7awpz6VNisV7hG6I1ZzrZUA+256g8MU/dTMKaEGn7NtNFHlTq5d4YSZCsrNOsUIfbKgOgprF0U5+eOZX3jOtznhZSlNYjldc6BIGuYWEkGqgGCREO/szeg3DkUecZZcln7J2Td9lWty/DmokO5wCQb3T8m8Bb6TAvQ+4j//fAgMBAAECgYA3+r7CJrNRyxtuYijn5caOHaSqiUaTndYYNg27yU1rk26G5UAYCP1MONhGdq2iQsgaWWnLnlKWu2V85r53TouvzH1dmnR/s9mguVbjhYYsQ7zTbbAjQSImtNcWfkoGpPMR7uglkHfUlX16xF9iRfZN5pcZm/Sp8nQ7wVVXkIUBIQJBANFUiKhIlR7us+xL1Je7ZxgRg+KaIs7MDATNKtcf5FiJx0QHFvi0ezpDHIvBXhVIYgVm7EYOiEYCzb06jweZgAkCQQC/wQ1uawneOpobg76OVNGH28G1upC6xD+LeuSSU4e7Z3+YfJ1o1u83IJagNQNsDXb8S/gklw1R829iYQj0DCqnAkEAkcItDhDMVSedfRIoTCcf2DCKBwWQ6zJFxCoghH8ef1Agwou1QSRbEeydOetBWcx3BI/wQa/oz+cv322hHoeSEQJBAJm/7UkPwkXRrydIp03wbGEGr3dLNCjMmjb4PrWlDDwTbJeTs5MQY5ZMJvomB6xnz3PUZg7QnvmKu1CihU9JQhkCQD/dOHBP+/SN+NuBNJY9Ilj2sfkoH7psCAm57okSmTD6nJsqW9DPJJIXFnueKDN8SKg5QGmUri+swOFfqHPjpGM=
RSA算法加密耗时:378ms
encryptData=VGPHIUyMEHmipPai1Lz+jkET3QjTopIggS6I8AtvzeoIwTqR9ZWXy+fWaYN7L8na+bbd1NSpAx6V97Eb0doVTTwKtwBF7peG2ofFpz6ZqqLzo9ShpYKOY7CELFY/a40NOK8VxF7zz5iOdKVNgAGh7ei119bntApDkWypPA+cNk8=
解密耗时:6ms
decryptData={"fromCardNum": "622135689832498329", "payAmount": 1000.00, "toCardNum": "623269874369721685"}

这里RSA 算法加密用时378ms, 解密用时了6ms, 当然加密解密的耗时也和被加密和解密的内容长度有关。

AES 加密/解密

AES 是一种经典的加密/解密算法,使用加密函数和解密密钥来完成对明文的加密,然后使用相同的秘钥和对应的函数来完成解密。AES 的优点在于效率非常高,相比RSA 算法的效率要高得多。AES算法 加密/解密流程如下图所示:

AES 的加密和解密需要借助秘钥,秘钥是提前生成的,支付机构根据一定的规则生成密钥之后,传输给商户,商户上送的数据需要使用秘钥进行加密,支付机构收到密文之后使用相同的秘钥进行解密。

AES 加密/解密示例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package org.sang.utils;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AESUtil {
    // 指定算法类型
    public static String AES = "AES";
    // 指定秘钥长度
    public static int KEY_LEN = 128;
    // 指定编码格式
    public static String UTF_8 = "UTF-8";

    /**
     * 生成 AES 秘钥
     * @return aesKey
     */
    public static String genAESKey() throws Exception{
        // 构造秘钥生成器,指定 AES 算法
        KeyGenerator keyGenerator = KeyGenerator.getInstance(AES);
        // 生成一个指定位数的随机源,KEY_LEN=128 就是 128位
        keyGenerator.init(KEY_LEN);
        // 生成对称秘钥
        SecretKey secretKey = keyGenerator.generateKey();
        return Base64.getEncoder().encodeToString(secretKey.getEncoded());
    }

    /**
     * AES 算法加密
     * @param key 秘钥
     * @param data 待加密字符串数据
     * @return encryptData
     */
    public static String encrypt(String key, String data) throws Exception{
        // 获取key
        SecretKey secretKey = new SecretKeySpec(Base64.getDecoder().decode(key.getBytes()), AES);
        // 根据指定算法生成密码器
        Cipher cipher = Cipher.getInstance(AES);
        // 初始化密码器
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        // 将加密内容转成字节数组
        byte[] byteData = data.getBytes(UTF_8);
        // 将字节数组加密
        byte[] aesData = cipher.doFinal(byteData);
        return new String(Base64.getEncoder().encode(aesData));
    }

    /**
     * AES 算法解密
     * @param key 秘钥
     * @param data 待解密字符串数据
     * @return decryptData
     */
    public static String decrypt(String key, String data) throws Exception{
        // 获取 key
        SecretKey secretKey = new SecretKeySpec(Base64.getDecoder().decode(key.getBytes()), AES);
        // 根据指定算法生成密码器
        Cipher cipher = Cipher.getInstance(AES);
        // 初始化密码器
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        // 将加密内容转换为字节数组,因数据是使用 Base64 转换过的,所以需要使用Base64解密
        byte[] dataByte = Base64.getDecoder().decode(data.getBytes(UTF_8));
        // 解密字节数组
        byte[] decryptData = cipher.doFinal(dataByte);
        return new String(decryptData);
    }
    
}
AES 加密/解密 测试

接下来我们写一个测试类来测试一下AES加密/解密的效果,测试类代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package org.sang.test;

import org.sang.utils.AESUtil;

public class AESTest {

    public static void main(String[] args) throws Exception {
        String aesKey = AESUtil.genAESKey();
        System.out.println("aesKey:"+aesKey);
        String jsonData = "{\"fromCardNum\": \"622135689832498329\", \"payAmount\": 1000.00, \"toCardNum\": \"623269874369721685\"}";
        // AES 算法加密算法开始时间戳
        long aesEncryptStartTime = System.currentTimeMillis();
        String encryptData = AESUtil.encrypt(aesKey, jsonData);
        // AES 算法加密算法结束时间戳
        long aesEncryptEndTime = System.currentTimeMillis();
        System.out.println("AES算法加密耗时:"+(aesEncryptEndTime-aesEncryptStartTime)+"ms");
        System.out.println("encryptData:"+encryptData);
        // AES 算法解密开始时间戳
        long aesDecryptStartTime = System.currentTimeMillis();
        String decryptData = AESUtil.decrypt(aesKey, encryptData);
        // AES 算法解密结束时间戳
        long aesDecryptEndTime = System.currentTimeMillis();
        System.out.println("AES算法解密耗时:"+(aesDecryptEndTime-aesDecryptStartTime)+"ms");
        System.out.println("decryptData:"+decryptData);
    }
}

执行 main 方法后控制台打印出如下结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
aesKey:NLrMFzsrl4w+z1eLEjYbtQ==
AES算法加密耗时:5ms
encryptData:mZTTCFlc6IUci5ryw5WDGQzHZl2DzGqlX7pg3iVDZJJdtkM5QFsKSbaUsRG3lDn74BxskH+nwUzXVK2zng3kxBR6e5C52gsV/XTb4pS85omfa/VNwJ+JEvqakshCfl93
AES算法解密耗时:0ms
decryptData:{"fromCardNum": "622135689832498329", "payAmount": 1000.00, "toCardNum": "623269874369721685"}

可以看到 AES 算法生成的秘钥长度比起RSA算法生成的秘钥来说要短得多,与RSA 算法同样的加密内容,加密只耗时5ms, 而解密更是不足1ms, 效率明显高于RSA 算法。

结语

在支付领域,考虑到对安全性和高效性的要求,通常不会只采用一种加密算法,而是采用多种加密算法组合加密的方式。RSA加密算法虽然安全,但是计算量非常大,效率比较低,在高并发情况下会面临严重的性能问题。

AES 加密的秘钥 key 在网络传输中有被拦截的风险,存在很大的安全隐患。所以,通常的办法是使用 RSA 算法生成的公钥来加密 AES 的秘钥,然后使用RSA 算法生成的私钥来解密经过网络传输过来经过加密的AES秘钥, 最后用解密后的AES秘钥来对报文进行加密传输。这样既保证了AES秘钥在网络传输过程中的安全性,也保证了高并发场景下加密和解密的高效,安全性和高效性得到了兼顾。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 阿福谈Web编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
加解密算法分析与应用场景
在日常开发中,无论是使用何种编程语言,我们都会遇到加解密的需求。例如,为了保护接口数据安全,我们需要对数据进行加密传输;在HTTPS协议中,通过非对称加密传输客户端私钥,然后双方使用该私钥进行对称加密通信;使用MD5算法进行文件一致性校验等。然而,面对众多的加解密方案,我们往往不清楚何时使用哪种方法。本文将为您梳理当前主流的加解密技术,并对算法进行科普性说明,但不涉及具体算法分析。根据日常应用场景,加解密技术大致可分为以下四类:
不惑
2024/05/13
6010
加解密算法分析与应用场景
数据安全RSA算法,加密解密,签名验签流程详解
(1)、乙方生成一对密钥即公钥和私钥,私钥不公开,乙方自己持有,公钥为公开,甲方持有。
知了一笑
2019/10/23
2.2K0
数据安全RSA算法,加密解密,签名验签流程详解
RSA公钥加密私钥解密实例
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/79966871
DannyHoo
2018/09/13
4.3K0
RSA公钥加密私钥解密实例
非对称加密之RSA是怎么加密的
前几天阿粉刚刚说了这个 MD5 加密的前世今生,因为 MD5 也确实用的人不是很多了,阿粉就不再继续的一一赘述了,今天阿粉想给大家分享的,是非对称加密中的一种,那就是 RSA 加密算法。
Java极客技术
2022/12/04
1.3K0
【深度知识】RSA加密、解密、签名、验签的原理及方法
RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。者能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称之为公钥和私钥。如果用公钥进行加密,则只能通过对应的私钥去解密,如果用私钥进行加密,则只能通过对应的公钥去解密。两者之间有数字相关,该加密发酸的原理就是对一极大整数做因数分解的困难行来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)
辉哥
2021/03/02
6.9K0
【深度知识】RSA加密、解密、签名、验签的原理及方法
如何使用Java进行加密和解密
在Java中,我们可以使用许多不同的加密和解密技术来保护数据。这些技术可以用于加密密码、保护敏感数据、网络通信等。下面将介绍Java中常用的加密和解密技术和实现方法。
用户1289394
2023/09/22
7770
如何使用Java进行加密和解密
java加密解密
1 package com.jetsum.util; 2 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.io.IOException; 6 import java.security.InvalidAlgorithmParameterException; 7 import java.security.InvalidKeyException
landv
2018/05/24
7K0
SpringBoot 实现 RAS+AES 自动接口解密
目前常用的加密方式就对称性加密和非对称性加密,加密解密的操作的肯定是大家知道的,最重要的使用什么加密解密方式,制定什么样的加密策略;考虑到我技术水平和接口的速度,采用的是RAS非对称加密和AES对称加密一起用!!!!
程序员蜗牛
2024/05/10
2050
SpringBoot 实现 RAS+AES 自动接口解密
​谁再问我加密算法、签名算法、我上去就是一jio
上面的例子只是用来说明网络环境下的数据安全问题,现实中应该没有这么蠢的黑客吧 哈哈。而且像美团、QQ这种软件都有较为完善的机制。
敲得码黛
2021/02/22
5581
​谁再问我加密算法、签名算法、我上去就是一jio
Java安全之安全加密算法
本篇文来谈谈关于常见的一些加密算法,其实在此之前,对算法的了解并不是太多。了解的层次只是基于加密算法的一些应用上。也来浅谈一下加密算法在安全领域中的作用。写本篇文也是基于算法的应用和实现,也是我的基本原则,能用就行。
全栈程序员站长
2021/04/07
1.4K0
Java安全之安全加密算法
java——加密、解密算法
  1. 对称加密算法: 密钥较短,破译困难,除了数据加密标准(DES),另一个对称密钥加密系统是国际数据加密算法(IDEA),它比DES的加密性好,且对计算机性能要求也没有那么高。 优点: 算法公开、计算量小、加密速度快、加密效率高 缺点: 在数据传送前,发送方和接收方必须商定好秘钥,然后 使双方都能保存好秘钥。其次如果一方的秘钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。   2. 非对称加密算法: 公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。 优点: 安全 缺点: 速度较慢
不愿意做鱼的小鲸鱼
2022/09/26
3K0
java——加密、解密算法
【Android】Android加密和解密方式
不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。 如信息摘要(Message Digest)和安全散列(Secure Hash)算法属于此类,常见的算法包括 MD5、SHA1、PBKDF2、bcrypt 等。 特点: 使用MD5和SHA进行加解密:
全栈程序员站长
2022/08/30
7020
Java中的加密与安全,你了解多少
  什么是数据安全?假如Bob要给Alice发送一封邮件,在发送邮件的过程中,黑客可能会窃取到邮件的内容,所以我们需要防窃听;黑客也有可能会篡改邮件的内容,所以Alice必须要有能有去识别邮件是否被篡改;最后,黑客也可能假冒Bob给Alice发送邮件,所以Alice还必须有能力识别出伪造的邮件。所以数据安全的几个要点就是:防窃听、防篡改和防伪造。 古代的加密方式:
程序员波特
2024/01/19
2620
Java中的加密与安全,你了解多少
学一学RSA加密吧,下次对接的时候就不会被对方Diss了
RSA加密算法:是一种非对称加密算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥;公钥用作加密,私钥则用作解密。只能用相对应的私钥才能解密并得到原本的明文,最初用来加密的公钥不能用作解密,加密和解密需要两个不同的密钥,因此被称为非对称加密,加密的双方在开发前根据明文的长度/数据加密等级需要协定好密钥的位数,目前可使用1024、2048、4096字节的密钥(key),安全性随字节长度升高而升高,性能随之而下降,时间复杂度为O(nlogn)。
关忆北.
2021/12/07
1.2K0
关于加解密、加签验签的那些事 | 得物技术
面对MD5、SHA、DES、AES、RSA等等这些名词你是否有很多问号?这些名词都是什么?还有什么公钥加密、私钥解密、私钥加签、公钥验签。这些都什么鬼?或许在你日常工作没有听说过这些名词,但是一旦你要设计一个对外访问的接口,或者安全性要求高的系统,那么必然会接触到这些名词。所以加解密、加签验签对于一个合格的程序员来说是必须要掌握的一个概念。接下来我们就一文彻底搞懂这些概念。
用户10346649
2023/03/10
1.1K0
关于加解密、加签验签的那些事 | 得物技术
对称加密与非对称加密
优点:速度快,对称性加密通常在消息发送方需要加密大量数据时使用,算法公开、计算量小、加密速度快、加密效率高。
lyb-geek
2022/03/09
2.6K0
说一下你常用的加密算法
加密算法我们整体可以分为:可逆加密和不可逆加密,可逆加密又可以分为:对称加密和非对称加密。
Java旅途
2020/07/23
1.9K0
每日一博 - 对称加密算法 vs 非对称加密算法
我们今天来梳理一下将分别介绍这两种加密算法的优缺点,并通过Java代码实现和测试结果来验证其效果。
小小工匠
2023/05/29
4920
加密-解密详解
参考视频: https://www.bilibili.com/video/BV1tz4y197hm
用户5927264
2020/07/30
2.9K0
Android-加解密
不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。 如信息摘要(Message Digest)和安全散列(Secure Hash)算法属于此类,常见的算法包括 MD5、SHA1、PBKDF2、bcrypt 等。 特点:
android_薛之涛
2018/12/19
1.2K0
Android-加解密
相关推荐
加解密算法分析与应用场景
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验