`
hbxflihua
  • 浏览: 683345 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

常用加密算法

阅读更多

加密算法分类

加密算法按是否可逆分为单向加密和双向加密。

 

单向加密

        单向加密是不可逆的,也就是说只能进行加密,不能进行解密。通常用来传输或者存储敏感数据,如用户名、密码等。单向加密原则上不可破解,网络上所谓的破解实际上都属于碰撞,就是把常见的明文进行加密成密文后将明文和密文存储起来,然后逆向查询得到明文。常见的单向加密算法有MD5和SHA等。

 

双向加密

        双向加密又称为可逆加密,分为对称加密和非对称加密。

 

对称加密

        对称加密指加密和解密采用相同的密钥进行加解密的算法。对称加密的优点在于加解密的速度快和破解难度和密钥长度正相关。常见的对称加密算法:DES、3DES、IDEA、RC4、RC5、RC6、AES等。

 

非对称加密

        非对称加密指加密和解密使用不同的密钥进行加解密的算法,因此也称为公私钥加密。假设两个用户要加密交换数据,双方交换公钥,使用时一方用对方的公钥加密,另一方即可用自己的私钥解密。非对称加密可以用来进行加解密,也可以用来进行加签和验签。常见的非对称加密算法:RSA、 DSA、 ECC等。

        另外提一点:加密和解密都是配对密钥进行的,可以公钥加密私钥解密,也可以私钥加密公钥解密。但是为了安全,通常都是以对方的公钥加密,自持私钥解密。

 

对称加密和非对称比较

        对称加密密钥管理比较难,不适合互联网,一般用于内部系统,安全性一般,加密速度快。

        非对称加密密钥管理简单,安全性高,加密速度慢,适合小数据量的数据加密和数据签名。

 

以下为RSA加密算法工具类,仅供参考:

package com.huatech.common.util;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.SignatureException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
/**
 * 工具类
 */
public class RSAUtil {
	
    /**
     * 读取秘钥数据
     * @param keyFilePath
     * @return
     */
    public static byte[] readKeyDatas(String keyFilePath){
        BufferedReader bufferedReader=null;
        try{
            bufferedReader = new BufferedReader(new FileReader(keyFilePath));
            String str=null;
            StringBuilder stringBuilder=new StringBuilder();
            while ((str=bufferedReader.readLine())!=null){
                if(str.contains("---")){
                    continue;
                }
                stringBuilder.append(str);
            }
            return stringBuilder.toString().getBytes();
        }catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
    
    /**
     * 读取公钥
     * @param publicKeyPath
     * @return
     */
    public static PublicKey getPublicKey(String publicKeyPath){
        //1.读取公钥文件,获取公钥数据
        byte[] bytesPublicBase64 = readKeyDatas(publicKeyPath);
        //2.对读取回来的数据进行Base64解码
        byte[] bytesPublic = Base64.getDecoder().decode(bytesPublicBase64);
        //3.把解码后的数据,重新封装成一个PublicKey对象
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytesPublic);
        KeyFactory keyFactory=null;
        try {
            keyFactory = KeyFactory.getInstance("RSA");
            PublicKey publicKey = keyFactory.generatePublic(keySpec);
            return publicKey;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 读取私钥
     * @param privateKeyPath
     * @return
     */
    public static PrivateKey getPrivateKey(String privateKeyPath){
        //1.读取私钥文件,获取私钥数据
        byte[] bytesPrivateBase64 = readKeyDatas(privateKeyPath);
        //2.对读取回来的数据进行Base64解码
        byte[] bytesPrivate = Base64.getDecoder().decode(bytesPrivateBase64);
        //3.把解码后的数据,重新封装成一个PrivateKey对象
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytesPrivate);
        KeyFactory keyFactory=null;
        try {
            keyFactory = KeyFactory.getInstance("RSA");
            PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
            return privateKey;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 加密数据
     * @param publicKey
     * @param originData
     * @return
     */
    public static String encodeData(PublicKey publicKey,String originData){
        try {
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE,publicKey);
            byte[] bytesEncrypt = cipher.doFinal(originData.getBytes());
            //Base64编码
            byte[] bytesEncryptBase64 = Base64.getEncoder().encode(bytesEncrypt);
            return new String(bytesEncryptBase64);            
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 解密数据
     * @param privateKey
     * @param encodeData
     * @return
     */
    public static String decodeData(PrivateKey privateKey,String encodeData){
        try {
            //Base64解码
            byte[] bytesEncrypt = Base64.getDecoder().decode(encodeData);
            //加密
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] bytesDecrypt = cipher.doFinal(bytesEncrypt);
            return new String(bytesDecrypt);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        }
        return null;
    }   
    
    /**
     * 签名
     * @param privateKey
     * @param data
     * @return
     */
    public static byte[] signData(PrivateKey privateKey, String data){
    	byte[] signed = null;
    	Signature signature;
		try {
			signature = Signature.getInstance("Sha1WithRSA");
			signature.initSign(privateKey);
			signature.update(data.getBytes("UTF-8"));
			signed = signature.sign();
		} catch (NoSuchAlgorithmException e) {
		} catch (InvalidKeyException e) {
		} catch (SignatureException | UnsupportedEncodingException e) {
		}
        return signed;
    }
    
    /**
     * 验签
     * @param publicKey
     * @param data
     * @param signed
     * @return
     */
    public static boolean verifySign(PublicKey publicKey, String data, byte[] signed){
    	boolean verify = false;
    	Signature signature2;
		try {
			signature2 = Signature.getInstance("Sha1WithRSA");
			signature2.initVerify(publicKey);
			signature2.update(data.getBytes("UTF-8"));
			verify = signature2.verify(signed);
		} catch (NoSuchAlgorithmException e) {
		} catch (InvalidKeyException e) {
		} catch (SignatureException | UnsupportedEncodingException e) {
		}
        return verify;
    }
    
    
}

 

 

分享到:
评论

相关推荐

    C语言常用加密算法.rar

    首先,我们来看看几种常见的加密算法: 1. **DES(Data Encryption Standard)数据加密标准**:DES是一种对称加密算法,基于64位的数据块和56位的密钥进行操作。尽管DES现在被认为安全性较低,但由于其简单快速,仍...

    C# 常用加密算法

    C# 常用加密算法 包括MD5 base64 hax等

    STM32加密库包,支持常见加密算法

    2. **加密算法**:加密库包支持的常见加密算法可能包括: - **AES(Advanced Encryption Standard)**:一种对称加密算法,用于保护大量数据的安全,速度快,效率高。 - **RSA**:非对称加密算法,用于公钥基础...

    常用加密算法演示

    在这个“常用加密算法演示”中,我们主要探讨了三种常见的加密算法:SHA256加盐加密、AES ECB加密以及AES CBC加密。下面将详细介绍这些加密算法及其特点。 首先,SHA256是一种广泛使用的哈希函数,用于生成固定长度...

    常用加密算法DLL库

    本文将详细介绍标题中提到的几种常见加密算法,以及如何在VC++6.0环境下使用DLL库进行操作。 首先,我们来看看标题中涉及的五种加密算法: 1. **AES(Advanced Encryption Standard)**:高级加密标准,是目前最...

    常见加密算法方式(对称加密和非对称加密)

    - **AES(Advanced Encryption Standard)**:高级加密标准,是目前最常用的对称加密算法之一,具有较高的安全性和较快的加密速度。 ### 非对称加密算法 非对称加密算法,又称公钥加密算法,其特点是加密和解密...

    常见加密算法c++源代码

    - **AES**:AES是目前最常用的对称加密算法,支持多种密钥长度(128、192、256位),安全性和效率都相对较高。 2. **非对称加密算法** 非对称加密算法使用一对公钥和私钥,公钥用于加密,私钥用于解密。这确保了...

    常见加密算法概述

    ### 常见加密算法概述 #### 一、引言 加密技术是信息安全领域中的核心组成部分,用于保护数据在传输过程中的安全性和完整性。本文将详细介绍几种常见的加密算法,包括对称加密算法(如DES、3DES、Blowfish等)和非...

    常见加密算法常见加密算法

    常见的加密算法主要分为对称加密和非对称加密两种类型。这里我们将深入探讨这两种加密方式及其代表性的算法。 首先,对称加密算法是最早使用的加密技术,其中加密和解密使用的是同一把密钥。这种算法的优点在于其...

    基于C++实现对常用加密算法改进及对抗思路源码+项目说明(含哈希、对称、校验码、编码格式等加密).zip

    基于C++实现对常用加密算法改进及对抗思路源码+项目说明(含哈希、对称、校验码、编码格式等加密).zip基于C++实现对常用加密算法改进及对抗思路源码+项目说明(含哈希、对称、校验码、编码格式等加密).zip基于C++...

    c#常用加密算法.pdf

    根据提供的文件信息,本文将详细解析C#中几种常用的加密算法,包括MD5、RC2以及RSA,并重点介绍这些加密算法的基本概念、应用场景及其在C#中的具体实现方式。 ### 一、MD5加密算法 #### 1.1 概述 MD5(Message-...

    swift-一个关于常用加密算法的Demo

    本Demo,"swift-一个关于常用加密算法的Demo",聚焦于多种常见的加密技术,旨在帮助开发者理解和应用这些算法以增强应用的安全性。下面我们将深入探讨MD5和RSA这两种在Demo中出现的加密算法。 MD5(Message-Digest ...

    常用加密算法工具(计算器)

    加密算法计算器,支持DES 3DES CBC MAC SM2 SM3 SM4 MD5 SHA等 CPU卡,加密算法,java卡类行开发者助手!

    常见加密算法讲解.ppt

    现代密码学已经发展出更为强大的加密算法,如基于数学难题的非对称加密,以及使用哈希函数和数字签名提供数据完整性和不可抵赖性。这些技术广泛应用于互联网通信、金融交易、个人隐私保护等多个领域,确保了信息的...

    常见加密算法

    加密算法在信息技术领域扮演着至关重要的角色,它们用于保护数据的隐私、确保网络通信的安全以及验证数据的完整性和来源。以下是对标题和描述中提到的几种加密算法的详细解释: 1. MD5(Message-Digest Algorithm 5...

    常用加密算法简介(word)

    简单介绍了常用的几种加密算法 DES;mars;md5;rsa

    Java编程和android移动开发通用的常见加密算法实用.pdf

    本文件中提到的常见加密算法和摘要算法是两个重要的概念,它们在实际开发中有着广泛的应用。 一、加密算法 加密算法是一种将明文数据转换成看似随机的密文的数学方法。常见的加密算法有: 1. 对称加密算法:如DES...

Global site tag (gtag.js) - Google Analytics