Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >区块链基础:非对称算法

区块链基础:非对称算法

作者头像
程裕强
发布于 2022-05-06 11:51:23
发布于 2022-05-06 11:51:23
39600
代码可运行
举报
运行总次数:0
代码可运行

1.Hash算法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.hadron.security;

import java.security.MessageDigest;
import java.util.UUID;

import org.eclipse.jetty.util.security.Credential.MD5;

/**
 * crypto['krɪptoʊ]秘密成员,
 * 一些语言的crypto模块的目的是为了提供通用的加密和哈希算法
 * 加密工具类
 */
public class CryptoUtil {
    //工具类,隐藏构造器
    private CryptoUtil() {}

    /**
     * 计算给定字符串的SHA256值
     */
    public static String sha256(String str) {
        MessageDigest messageDigest;
        String hash = "";
        try {
            messageDigest = MessageDigest.getInstance("SHA-256");
            messageDigest.update(str.getBytes("UTF-8"));
            hash = byte2Hex(messageDigest.digest());
        } catch (Exception e) {
            System.out.println("getSHA256 is error" + e.getMessage());
        }
        return hash;
    }

    /**
     * 计算str的md5码(技巧:去除前几位,增强安全性)
     */
    public static String md5(String str) {
        String resultStr = MD5.digest(str);
        return resultStr.substring(4, resultStr.length());
    }

    /**
     * UUID的目的是让分布式系统中的所有元素都能有唯一的辨识
     * 获取一个UUID值,默认格式带有"-",需要删除所有的"-"
     */
    public static String getUUID() {
        return UUID.randomUUID().toString().replaceAll("\\-", "");
    }

    /**
     * 二进制字节数据转换为十六进制字符串形式
     * @param bytes
     */
    private static String byte2Hex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        String tmp;
        for (int i = 0; i < bytes.length; i++) {
            /**
             * 注意toHexString(int i)的参数类型是32位int型,而传输入8位byte型数据会转换int型。
             * 转换后高24为也看作有效位,正数不影响,而负数会导致错误。
             * java中采用的是补码的形式表示负整数,比如byte的-1(0xff,11111111),会转换成int型的-1(0xffffffff),
             * 而oxff默认是int型,表示为0000 0000 0000 0000 0000 0000 1111 1111
             * 一个byte跟0xff &运算,高的24个比特就总会被清0,得到我们想要的结果。
             */
            tmp = Integer.toHexString(bytes[i] & 0xFF);
            if (tmp.length() == 1) {
                sb.append("0");
            }
            sb.append(tmp);
        }
        return sb.toString();
    }

    public static void main(String[] args){
        String s="chengyuqiang";
        System.out.println(CryptoUtil.md5(s));
        System.out.println(CryptoUtil.sha256(s));
        System.out.println(CryptoUtil.getUUID());
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1163a12be8b90e692445a7115ca900f4
c7a8233d922f3db03f1c7a0864675cb5092ce850d033b7ea07ca5208da27edfe
b286928d476b4de0aa5b8c83b7b27e54

2、RSA非对称算法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.hadron.security;

import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
import javax.crypto.Cipher;


/**
 * RSA安全编码组件
 */
public abstract class RsaUtil extends Coder {
    public static final String KEY_ALGORITHM = "RSA";
    public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
    private static final String PUBLIC_KEY = "RSAPublicKey";
    private static final String PRIVATE_KEY = "RSAPrivateKey";

    /**
     * 初始化密钥
     */
    public static Map<String, Object> initKey() throws Exception {
        //RSA密钥对生成器
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
        //初始化
        keyPairGen.initialize(1024);
        //耗时操作,动态生成密钥对
        KeyPair keyPair = keyPairGen.generateKeyPair();
        //获取公钥
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        //获取私钥
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
        //保存密钥对
        Map<String, Object> keyMap = new HashMap<String, Object>(2);
        keyMap.put(PUBLIC_KEY, publicKey);
        keyMap.put(PRIVATE_KEY, privateKey);
        return keyMap;
    }
    /**
     * 取得私钥
     */
    public static String getPrivateKey(Map<String, Object> keyMap) throws Exception {
        Key key = (Key) keyMap.get(PRIVATE_KEY);
        return encryptBASE64(key.getEncoded());
    }

    /**
     * 取得公钥
     */
    public static String getPublicKey(Map<String, Object> keyMap) throws Exception {
        Key key = (Key) keyMap.get(PUBLIC_KEY);
        return encryptBASE64(key.getEncoded());
    }

    /*******************公钥加密,私钥解密**************************/

    /**
     * 消息发送者用对方公钥加密
     */
    public static byte[] encryptByPublicKey(byte[] data, String key) throws Exception {
        // 对公钥BASE64解密,取得公钥
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(decryptBASE64(key));
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        Key publicKey = keyFactory.generatePublic(x509KeySpec);

        // 对数据加密
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        //将Cipher初始化为加密模式
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        //数据将被加密或解密
        return cipher.doFinal(data);
    }
    /**
     * 消息接收者用自己的私钥解密
     */
    public static byte[] decryptByPrivateKey(byte[] data, String key) throws Exception {
        // decryptBASE64(key)对密钥解密,取得私钥
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(decryptBASE64(key));
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
        // 对数据解密
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        //将Cipher初始化为解密模式
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        //数据将被加密或解密
        return cipher.doFinal(data);
    }

    /*******************秘钥加密,公钥验证***********************/

    /**
     * 消息发送者用自己的私钥加密
     */
    public static byte[] encryptByPrivateKey(byte[] data, String key) throws Exception {
        // 对密钥解密,取得私钥
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(decryptBASE64(key));
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
        // 对数据加密
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        //加密模式
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
        return cipher.doFinal(data);
    }
    /**
     * 用公钥解密
     */
    public static byte[] decryptByPublicKey(byte[] data, String key) throws Exception {
        //对密钥解密, 取得公钥
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(decryptBASE64(key));
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        Key publicKey = keyFactory.generatePublic(x509KeySpec);
        // 对数据解密
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        //解密模式
        cipher.init(Cipher.DECRYPT_MODE, publicKey);
        return cipher.doFinal(data);
    }

    /****************数字签名:私钥加密,公钥验证**********************/

    /**
     * 用发送者的私钥对信息生成数字签名
     * @param data : 加密数据
     * @param privateKey: 私钥
     */
    public static String sign(byte[] data, String privateKey) throws Exception {
        // 解密由base64编码的私钥,构造PKCS8EncodedKeySpec对象
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(decryptBASE64(privateKey));
        //指定的加密算法RSA
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        //取私钥匙对象
        PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
        //Signature类用来提供数字签名算法功能
        //可以将签名算法指定为 MD2withRSA、MD5withRSA 或 SHA1withRSA
        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
        //用私钥初始化这个用于签名的对象
        signature.initSign(priKey);
        //使用指定的byte数组更新要签名或验证的数据
        signature.update(data);
        //sign()返回已更新数据的签名字节,再进行BASE64加密
        return encryptBASE64(signature.sign());
    }

    /**
     * 使用发送者的公钥校验数字签名
     * 通过发送者的公钥publicKey验证他签名内容sign是否符合data数据
     * @param data: 加密数据
     * @param publicKey: 公钥
     * @param sign: 数字签名
     * @return 校验成功返回true 失败返回false
     */
    public static boolean verify(byte[] data, String publicKey, String sign) throws Exception {
        // 解密由base64编码的公钥,构造X509EncodedKeySpec对象
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decryptBASE64(publicKey));
        // 指定加密算法RSA
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        // 取公钥匙对象
        PublicKey pubKey = keyFactory.generatePublic(keySpec);
        //Signature类用来提供数字签名算法功能
        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
        //用公钥初始化验证对象
        signature.initVerify(pubKey);
        //使用指定的byte数组更新要签名或验证的数据
        signature.update(data);
        // 验证签名是否正常
        return signature.verify(decryptBASE64(sign));
    }

    public static void main(String[] args) throws Exception{
        String s="chengyuqiang";
        /**
         * 测试公钥加密,私有解密
         */
        Map<String, Object> map=RsaUtil.initKey();
        String publicKey=RsaUtil.getPublicKey(map);
        String privateKey=RsaUtil.getPrivateKey(map);
        System.out.println("公钥:\n"+publicKey);
        System.out.println("私钥:\n"+privateKey);
        //公钥加密
        byte[] msg=RsaUtil.encryptByPublicKey(s.getBytes(), publicKey);
        //秘钥解密
        msg=RsaUtil.decryptByPrivateKey(msg, privateKey);
        System.out.println("解密:\n"+new String(msg));

        /**
         * 测试私签名,公钥验证签名
         */
        // 产生签名
        String sign = RsaUtil.sign(s.getBytes(), privateKey);
        System.out.println("签名内容:\n"+sign);
        //验证签名
        boolean status = RsaUtil.verify(s.getBytes(), publicKey, sign);
        System.out.println("签名正确:\n"+status);
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
公钥:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2N1dAK2NzzcOjRwb3rBjT+NvpMKKgL98Pr3D0
jE99hfJL2MpuKflA0U18EKnZT1QjrninAeLHiR1BlnuJpHVGKNPkzXuIhggiHlvdb9WwsfB+u+pf
Igca7cURYR+4bELE+hlUVP8nyMuD9Vs8bY23oHG2Ff/svVQEo/j4uOMAywIDAQAB

私钥:
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALY3V0ArY3PNw6NHBvesGNP42+kw
oqAv3w+vcPSMT32F8kvYym4p+UDRTXwQqdlPVCOueKcB4seJHUGWe4mkdUYo0+TNe4iGCCIeW91v
1bCx8H676l8iBxrtxRFhH7hsQsT6GVRU/yfIy4P1WzxtjbegcbYV/+y9VASj+Pi44wDLAgMBAAEC
gYBOOEFvHXEK1CiIXcQi67CYxfp5BtS42PPzQsfFYrn401gosP5s/f2ukmqluG2BCKnAy3OllYyp
RTXW4udTNdLVOiglX5TSCk1zp3Hn6oLbbjWIpoqAhx5PJslZY35MscNYVViz69FwLHjCeDWRitsV
f/eDHyC+r6vb3PQTgpjegQJBAOvtWqLhMNhAOel14pirf+A520xz/gzpSj/dCzTS53oLGvCJqzn1
HJqA4xmhEf8MMcHN4+SiVtjQdKVINaFbeUECQQDFuCBzCMLKHNfrUp35lOlnmAT5RBEU+0CV85jl
oERpLTU1v6igsP6mxXJXXRQpNzP2orN1IbrVVwF8uuUU/wsLAkBiDtH4Fs69YtxvG08mE0ngAUwT
l7ZE2YXBy3bH6szI3erBhQbE3QqZcO5zDY40SnY3zgJlWc/s559DvyKDQUjBAkEAqa7filnWcgZW
98orcWpu9Uzt186mqk8Gmqo4abklfO4jYEFfwqijoxSIkJl9F/IcUmpHgRq1cSn+SMFMoLxRCQJA
PJFE5keSZgjJpGsMAdEIpHKKUxF5vd+oS9+Z7EpSn7VGTRPLycSIDKQT2F9/QV1z5IKni1jqbnXs
imRw1coviw==

解密:
chengyuqiang
签名内容:
BqJgQ4ciZNH0bE0TQeTgQQbF+h0jPNauHbgc95L8QggwD0p8qb4fdEjsmevdiN0OszOqyR9z71S9
LXCeH+ZeKVZagRWG0jx0Bfk74Rf5Pt2MMPqjzlDRfCTJyg0z8GjC/U70IaxgfgkrFVf3rsk4XzAB
R045Sjf2P+nJf/hf4wE=

签名正确:
true

3、RsaUtil 的父类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.hadron.security;

import java.security.MessageDigest;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
 * 基础加密组件
 * 
 */
public abstract class Coder {
    public static final String KEY_SHA = "SHA";
    public static final String KEY_MD5 = "MD5";
    //HMAC(Hash Message Authentication Code),散列消息鉴别码,基于密钥的Hash算法的认证协议
    public static final String KEY_MAC = "HmacMD5";

    //BASE64实现主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。

    /**
     * BASE64加密,把任意序列的8位字节描述为一种不易被人直接识别的形式。
     * BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充
     */
    public static String encryptBASE64(byte[] key) throws Exception {
        return (new BASE64Encoder()).encodeBuffer(key);
    }
    /**
     * BASE64解密
     */
    public static byte[] decryptBASE64(String key) throws Exception {
        return (new BASE64Decoder()).decodeBuffer(key);
    }

    /**
     * JDK提供的MD5算法实现
     */
    public static byte[] encryptMD5(byte[] data) throws Exception {
        MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
        md5.update(data);
        return md5.digest();
    }

    /**
     * JDK提供的SHA算法
     */
    public static byte[] encryptSHA(byte[] data) throws Exception {
        MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
        sha.update(data);
        return sha.digest();

    }

    /**
     * 初始化HMAC密钥
     */
    public static String initMacKey() throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
        SecretKey secretKey = keyGenerator.generateKey();
        return encryptBASE64(secretKey.getEncoded());
    }

    /**
     * HMAC加密
     */
    public static byte[] encryptHMAC(byte[] data, String key) throws Exception {
        SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());
        mac.init(secretKey);
        return mac.doFinal(data);
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JAVA非对称加密算法-RSA算法
这篇文章上次修改于 255 天前,可能其部分内容已经发生变化,如有疑问可询问作者。 一、概述 RSA是基于大数因子分解难题。目前各种主流计算机语言都支持RSA算法的实现 java6支持RSA算法 RSA算法可以用于数据加密和数字签名 RSA算法相对于DES/AES等对称加密算法,他的速度要慢的多 总原则:公钥加密,私钥解密 / 私钥加密,公钥解密 二、模型分析 RSA算法构建密钥对简单的很,这里我们还是以甲乙双方发送数据为模型 甲方在本地构建密钥对(公钥+私钥),并将公钥公布给乙方 甲方将数据用私钥进
Erwin
2019/12/31
3.7K0
RSA非对称加密
需要注意的一点,这个公钥和私钥必须是一对的,如果用公钥对数据进行加密,那么只有使用对应的私钥才能解密,所以只要私钥不泄露,那么我们的数据就是安全的。
会跳舞的机器人
2018/09/03
1.6K0
请看,常见的加密算法及详解都在这里!
加密算法,是现在每个软件项目里必须用到的内容。广泛应用在包括了用户登入、数字签名、数据传输等多个场合。那大家都知道那些呢?今天我把常见的加密算法全部整理在这里,供大家学习参考。
攻城狮的那点事
2019/12/10
1.5K0
RSA 加解密 1024 位 & 2048 位
RSA 算法是一种非对称加密算法,会生成一对 RSA 秘钥,即公钥+私钥,将公钥提供给调用方,调用方使用公钥对数据进行加密后,接口根据私钥进行解密
BUG弄潮儿
2022/06/30
3.1K0
RSA 加解密 1024 位 & 2048 位
RAS非对称加解密-RAS加解密和签名和验签,密钥生成器(java代码)
RAS非对称加解密-RAS加解密和签名和验签,密钥生成器(java代码) RSA 算法是一种非对称加解密算法。服务方生成一对 RSA 密钥,即公钥 + 私钥,将公钥提供给调用方,调用方使用公钥对数据进行加密后,服务方根据私钥进行解密。
oktokeep
2024/10/09
1550
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
RSA+AES实现接口验签和参数加密
RSA是一种常用的非对称加密算法,加密和加密使用不同的密钥,常用于要求安全性较高的加密场景,比如接口的验签和接口数据的加密与解密。与非对称加密算法对比,其安全性较高,但是加密性能却比较低,不适合高并发场景,一般只加密少量的数据。
时代疯
2021/07/23
3.8K0
非对称加密之RSA是怎么加密的
前几天阿粉刚刚说了这个 MD5 加密的前世今生,因为 MD5 也确实用的人不是很多了,阿粉就不再继续的一一赘述了,今天阿粉想给大家分享的,是非对称加密中的一种,那就是 RSA 加密算法。
Java极客技术
2022/12/04
1.2K0
数据安全RSA算法,加密解密,签名验签流程详解
(1)、乙方生成一对密钥即公钥和私钥,私钥不公开,乙方自己持有,公钥为公开,甲方持有。
知了一笑
2019/10/23
2.2K0
数据安全RSA算法,加密解密,签名验签流程详解
Python的RSA加密和PBE加密
最近在写接口的时候,遇到了需要使用RSA加密和PBE加密的情况,对方公司提供的DEMO都是JAVA的,我需要用python来实现。 在网上搜了一下,python的RSA加密这块写的还是比较多的,但是PBE较少。所以我就讲讲我在RSA加密上面遇到的坑,大家权当一乐。PBE加密里面的盐、密钥。
py3study
2020/01/06
1.8K0
[Java 安全]消息摘要与数字签名
该文介绍了如何使用Java实现数字签名,包括DSA、RSA和ECDSA算法。文章还介绍了Java中的KeyPair和Signature类,以及如何使用这些类来实现数字签名和验证。
静默虚空
2018/01/05
1.2K0
[Java 安全]消息摘要与数字签名
说一下你常用的加密算法
加密算法我们整体可以分为:可逆加密和不可逆加密,可逆加密又可以分为:对称加密和非对称加密。
Java旅途
2020/07/23
1.9K0
【深度知识】RSA加密、解密、签名、验签的原理及方法
RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。者能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称之为公钥和私钥。如果用公钥进行加密,则只能通过对应的私钥去解密,如果用私钥进行加密,则只能通过对应的公钥去解密。两者之间有数字相关,该加密发酸的原理就是对一极大整数做因数分解的困难行来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)
辉哥
2021/03/02
6.8K0
【深度知识】RSA加密、解密、签名、验签的原理及方法
学一学RSA加密吧,下次对接的时候就不会被对方Diss了
RSA加密算法:是一种非对称加密算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥;公钥用作加密,私钥则用作解密。只能用相对应的私钥才能解密并得到原本的明文,最初用来加密的公钥不能用作解密,加密和解密需要两个不同的密钥,因此被称为非对称加密,加密的双方在开发前根据明文的长度/数据加密等级需要协定好密钥的位数,目前可使用1024、2048、4096字节的密钥(key),安全性随字节长度升高而升高,性能随之而下降,时间复杂度为O(nlogn)。
关忆北.
2021/12/07
1.2K0
Java加密与解密之非对称加密算法
非对称加密算法与对称加密算法的主要差别在于非对称加密算法用于加密和解密的密钥不相同,非对称加密算法密钥分为公钥和私钥,公钥加密只能用私钥解密,反之私钥加密只能用公钥解密。相比对称加密算法,非对称加密算法加/解密效率低,但安全性高,这两种算法一般结合使用。常见非对称加密算法有RSA、ECC、Elgamal等。
布禾
2020/11/24
1.2K0
RSA
RSA算法 非对称加密算法的一种 随意选择两个大的质数p和q,p不等于q,计算N=pq。 根据欧拉函数,不大于N且与N互质的整数個数為(p-1)(q-1)。 选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)。 用以下这个公式计算d:d× e ≡ 1 (mod (p-1)(q-1))。 (d*e)%((p-1)(q-1))=1 将p和q的记录销毁。 以上内容中,(N,e)是公钥,(N,d)是私钥。 公钥对象转为String byte[] keyByte=(Key)publicKey.
Dean0731
2020/09/16
9580
快速了解常用的非对称加密算法,再也不用担心面试官的刨根问底
加密算法通常被分为两种:对称加密算法和非对称加密算法。其中,对称加密算法在加密和解密时使用的密钥相同;非对称加密算法在加密和解密时使用的密钥不同,分为公钥和私钥。此外,还有一类叫做消息摘要算法,是对数据进行摘要并且不可逆的算法。
万猫学社
2022/04/22
1.6K0
快速了解常用的非对称加密算法,再也不用担心面试官的刨根问底
对加密-加签的完整流程
1.架构图 2.实例代码 package com.shi.encrypt.ascii; import com.alibaba.fastjson.JSONArray; import com.aliba
用户5927264
2020/07/30
9390
【Java小工匠聊密码学】--非对称加密--ElGamal
  ElGamal算法,是一种较为常见的加密算法,它是基于1985年提出的公钥密码体制和椭圆曲线加密体系。既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。在加密过程中,生成的密文长度是明文的两倍,且每次加密后都会在密文中生成一个随机数K,在密码中主要应用离散对数问题的几个性质:求解离散对数(可能)是困难的,而其逆运算指数运算可以应用平方-乘的方法有效地计算。也就是说,在适当的群G中,指数函数是单向函数。
Java小工匠
2018/08/10
8640
Java中的加密与安全,你了解多少
  什么是数据安全?假如Bob要给Alice发送一封邮件,在发送邮件的过程中,黑客可能会窃取到邮件的内容,所以我们需要防窃听;黑客也有可能会篡改邮件的内容,所以Alice必须要有能有去识别邮件是否被篡改;最后,黑客也可能假冒Bob给Alice发送邮件,所以Alice还必须有能力识别出伪造的邮件。所以数据安全的几个要点就是:防窃听、防篡改和防伪造。 古代的加密方式:
程序员波特
2024/01/19
2530
Java中的加密与安全,你了解多少
相关推荐
JAVA非对称加密算法-RSA算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验