精华内容
下载资源
问答
  • sha加密解密算法
    千次阅读
    2021-03-18 11:50:10

    一、概述

    加密分为单向加密双向加密

    单向加密 又称为不可逆加密,即生成密文无法反解的一种加密方式;eg:MD5和SHA系列、HMAC。
    双向加密 又称为可逆加密,即生成密文后,在需要的时候可以反解为明文;eg:RSA、AES、DES系列。

    双向加密又包括非对称加密对称加密

    对称性加密算法:也称单密钥加密。对称式加密就是加密和解密使用同一个密钥。
    信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行加解密了。对称加密算法用来对敏感数据等信息进行加密。
    非对称算法:非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为"公钥"和"私钥",两个必需配对使用。

    另外:Base64不是安全领域下的加解密算法,只是一个编码算法,通常用于把二进制数据编码为可写的字符形式的数据,特别适合在http,mime协议下的网络快速传输数据。UTF-8和GBK中文的Base64编码结果是不同的。采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到,但这种方式很初级,很简单。Base64可以对图片文件进行编码传输。这是一种可逆的编码方式。编码后的数据是一个字符串,其中包含的字符为:A-Z、a-z、0-9、+、/,共64个字符(26 + 26 + 10 + 1 + 1 = 64,其实是65个字符,“=”是填充字符。

    二、区别

    1、单向加密常用的算法

    • MD5:MD5摘要算法。数字摘要算法也被称为哈希算法、散列算法。无论是多长的输入,MD5 都会输出长度为 128bits 的一个散列值(通常用 16 进制 表示为 32 个字符)。

    2、对称加密:

    优点:对称加密算法使用同一个密匙加密和解密,速度快,适合给大量数据加密。
    缺点:对称加密客户端和服务端使用同一个密匙,存在被抓包破解的风险;需要大量钥匙,秘钥管理负担。
    常用的算法

    • DES:密钥长度可为128、192、256位 也就是16字节、24字节、32字节,DES是一种分组加密技术;
    • AES:密钥长度64位 ,也就是8字节,相比较有更高速度和资源使用效率,高级加密标准,是下一代的加密算法标准,速度快,安全级别高;

    3、非对称加密:
    优点:非对称加密算法使用公钥加密,私钥解密,私钥签名,公钥验签。安全性高,私钥留一方保管,不要外泄,公钥交给请求方。
    缺点:速度较慢。
    常用的算法

    • RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的。
    • Elgamal
    • 背包算法
    • Rabin
    • DSA:数字签名算法,是一种标准的 DSS(数字签名标准)
    • Ecc:椭圆曲线密码编码学。ECC和RSA相比,相同的密钥长度,其抗攻击性要强很多倍。计算量小,处理速度快。ECC总的速度比RSA、DSA要快得多。存储空间占用小。

    大量数据加密建议采用对称加密算法,提高加解密速度;小量的机密数据,可以采用非对称加密算法。

    4、密钥:
    选定了加密方式后,如何选择密钥:一般密钥越长运行速度越慢,所以根据实际需要的安全级别选择:一般RSA建议1024位的数字,ECC用160位,AES用128即可。

    了解更多参考:https://blog.csdn.net/baidu_22254181/article/details/82594072

    更多相关内容
  • 主要介绍了java实现的RC4加密解密算法,结合具体实例形式分析了java RC4加密解密算法的实现与使用技巧,需要的朋友可以参考下
  • 微信小程序通用实现MD5,AES(EBC)加解密,已用于项目 AES加密 ECB模式 可无IV(16位)
  • 主要介绍了Java实现的RSA加密解密算法,结合实例形式分析了java RAS加密解密算法的相关实现技巧,需要的朋友可以参考下
  • 主要介绍了PHP实现的XXTEA加密解密算法,结合实例形式分析了php XXTEA加密解密算法类的定义与简单使用操作技巧,需要的朋友可以参考下
  • import java.security.... * 采用SHA加密 * * @author peipei3514 * @datetime 2017-8-11 12:00:34 */ public class SHAUtil { /*** * SHA加密 生成40位SHA码 */ public static String shaEncode(...
    import java.security.MessageDigest;
    
    /**
     * 采用SHA加密
     * 
     * @author peipei3514
     * @datetime 2017-8-11 12:00:34
     */
    public class SHAUtil {
    	/***
    	 * SHA加密 生成40位SHA码
    	 */
    	public static String shaEncode(String data) throws Exception {
    		MessageDigest sha = MessageDigest.getInstance("SHA");
    
    		byte[] byteArray = data.getBytes("UTF-8");
    
    		// md5Bytes的长度为20
    		byte[] md5Bytes = sha.digest(byteArray);
    
    		// 转换成16进制字符串
    		StringBuffer hexValue = new StringBuffer();
    		for (int i = 0; i < md5Bytes.length; i++) {
    			int val = ((int) md5Bytes[i]) & 0xff;
    
    			// 为了满足40位长度,当值小于16时需要先添加一位0(小于16的话用一位就能表示)
    			if (val < 16) {
    				hexValue.append("0");
    			}
    			hexValue.append(Integer.toHexString(val));
    		}
    		return hexValue.toString();
    	}
    
    	public static void main(String args[]) throws Exception {
    		String str = new String("1A2B3C4D5E");
    		System.out.println("原始:" + str);
    		System.out.println("SHA后:" + shaEncode(str));
    	}
    }
    
    展开全文
  • 加密解密算法

    2021-07-08 16:36:13
    加密解密算法加密解密算法1、加密解密基础算法1、代表算法2、特点3、算法原理4、应用场景2、消息摘要算法1、描述2、特点3、分类4、算法原理5、应用场景3、对称加密算法1、概述2、算法原理3、算法特点4、算法分类4、...


    加密解密图解

    1、加密解密基础算法

    1、代表算法

    • Base64

    2、特点

    1、编码和解码操作可充当加密和解密操作
    2、数据保密强度不是很高

    3、算法原理

    1、发送方对数据加密
    2、发送加密的数据
    3、接收方对加密的文件进行解密

    4、应用场景

    1、电子邮件的传输
    2、网络数据的传输
    3、密钥的存储
    4、数字证书存储

    2、消息摘要算法

    2-1、描述

    • 消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文

    2-2、特点

    1、无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。
    2、消息摘要看起来是“随机的”
    3、一般地,只要输入的消息不同,对其进行摘要以后产生的摘要消息也必不相同;但相同的输入必会产生相同的输出。
    4、消息摘要函数是无陷门的单向函数。

    2-3、分类

    • MD系列(消息摘要算法)
      SHA系列(安全散列算法)
      MAC系列(消息认证码算法)

    2-4、算法原理

    • MD系列(消息摘要算法)

      • 对密码等密文文件加密,进行储存。当用户输入密码时,对其进行加密,然后和最初加密密文进行对比。
    • SHA系列(安全散列算法)

      1、甲方公布消息摘要算法。
      2、对待发布的消息进行摘要处理、并发送摘要信息和消息给乙方。
      3、乙方根据甲方公布摘要算法对摘要信息进行鉴别。

    • MAC系列(消息认证码算法)

      1、甲方公布消息摘要算法。
      2、甲方构建秘钥,并发送秘钥给乙方。
      3、甲方对消息进行摘要处理,并发送摘要信息和消息给乙方。
      4、乙方根据甲方公布摘要算法对信息进行鉴别。

    2-5、应用场景

    • 消息摘要算法不存在密钥的管理与分发问题,适合于分布式网络相同上使用

    3、对称加密算法

    3-1、概述

    1、解密算法是加密算法的逆运算,加密 密钥和解密密钥相同。
    2、对称加密易于理解,便于实现,根据 加密方式又分为密码和分组密码。
    3、对称加密算法系列,DES系列, DESede系列,AES系列,RC系列, IDEA系列,PBE系列。

    3-2、算法原理

    1、甲方构建秘钥并发送秘钥给乙方。
    2、用秘钥对数据进行加密,并且发送加密数据给乙方。
    3、乙方使用秘钥对数据进行解密。

    3-3、算法特点

    • 算法优点

    1、算法公开。
    2、计算量小。
    3、加密速度快。
    4、加密效率高。

    • 算法缺点

      1、数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥。
      2、如果一方的秘钥被泄露,那么加密信息也就不安全了。
      3、每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。

    3-4、算法分类

    • DES

      • 安全性

        • 破解该算法只有穷举
      • 特性

        • 优点

          1、短小精悍
          2、便于记忆

        • 缺点

          1、密钥太短
          2、迭代偏少
          3、半公开性

    • AES

      • 特性

        1、密钥建立时间短
        2、灵敏性好
        3、内存需求低
        4、高级数据加密标准,世界范围免费
        5、抵御了所有针对DES算法的攻击

    • Desede

      • 特性

        • 优点

          1、抗穷举攻击力
          2、迭代次数增多
          3、安全增强

        • 缺点

          1、处理速度慢
          2、密钥计算时间长
          3、加密速度不高

    • IDEA

      • 特性

        1、强加密算法(另辟蹊径,未出现对其攻击算法)
        2、自由出版交流
        3、目前最常用最流行的电子邮件加密方式之一

    • PBE

      • 特性

        1、基于口令加密,用户自己管理口令,增强安全保密性。
        2、对称加密算法和消息摘要算法合体。
        3、对DES或AES登其它对称加密算法做了相应操作。
        4、口令+盐加密规则加大破译难度,预防攻击性增强。
        5、MD5+DES算法构建的PBE算法。

      • 算法原理

        1、甲方构建口令并发送口令给乙方。
        2、甲方构建盐。
        3、甲方通过口令+盐方式对数据进行加密。并发送盐和加密后的数据给乙方。
        4、乙方使用口令和盐对加密的数据进行解密。

    4、非对称算法

    4-1、特点

    • 非对称加密算法加密和解密的密钥不同。一个公开的公钥和一个保密的私钥。公钥加密,私钥解密。反之,私钥加密,公钥解密。解决了加密算法对密钥的分配问题 ,提高算法的安全性。其安全性有着无法预约的高度,被应用安全领域较高B2B,B2C电子商务平台

    • 与对称算法对比

      1、公钥和私钥成对出现,公钥加密需要私钥解密,私钥加密的需要公钥解密。
      2、密钥管理问题不复存在,但是加密解密的效率极其低下

    4-2、算法原理

    4-2-1、乙方生成一对密钥(公钥和私钥)并将公钥向其它方公开。
    4-2-2、得到该公钥的甲方使用该密钥对机密信息进行加密后再发送给乙方。
    4-2-3、乙方再用自己保存的另一把专用密钥(私钥)对加密后的信息进行解密。乙方只能用其专用密钥(私钥)解密由对应的公钥加密后的信息。

    4-3、算法特点

    • 算法优点

      • 非对称加密与对称加密相比,其安全性更好:对称加密的通信双方使用相同的秘钥,如果一方的秘钥遭泄露,那么整个通信就会被破解。而非对称加密使用一对秘钥,一个用来加密,一个用来解密,而且公钥是公开的,秘钥是自己保存的,不需要像对称加密那样在通信之前要先同步秘钥。
    • 算法缺点

      • 非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。

    4-4、算法分类

    • DH算法

      • 特点

        1、通信双方发送消息之前需要约定加密算法发放密钥,密钥安全性高
        2、密钥协商算法,仅用于密钥分配问题,不能解决加密和解密问题。
        3、密钥交换法则基于有限域上的离散对数难题。

    • RSA算法

      • 特点

        1、仅需一套密钥就可以完成加密解密操作。
        2、公钥长度小于私钥长度,便于携带和发送。
        3、基于大数因子分解难题。

    • EIGAmal算法

      • 特点

        1、基于离散对数问题。
        2、既可以应用数据加密又可以应用数字签名。
        3、接收者公布公钥,发送者用公钥加密,接收者用私钥解密

    5、数字签名

    5-1、简述

    • 数字签名可以看做是一种带有密钥的消息摘要算法,密钥包含了公钥和私钥,是由非对称加密算法和消息摘要算法的合体。

    5-2、特点

    1、数据的完整性,认证数据来源,抗否认作用。
    2、甲方签名操作,乙方根据甲方的提供消息进行消息验证。私钥签名,公钥验证(私钥和待加密的数据获取签名值,公钥和签名值对数据验证)。

    5-3、算法分类

    1、RSA算法

    - 简述
    
    	- RSA算法是数字签名中的第一个算法,源于RSA公钥密码算法的思想,将RSA公钥密码算法按照数字签名的方式运用。RSA数字签名算法的密钥实现与RSA加密算法一致
    
    - 实现
    
    	- MD系列(MD2WithRSA,MD5WithRSA)
    

    SH系列(SH224WithRSA,SH256WithRSA,SH384WithRSA,
    SH512WithRSA)

    • 2、DSA算法

      • 简述

        • 由RSA算法是数字签名算法转换成标准的数字签名算法。DSA算 法仅有数字签名功能,而RSA算法的加密解密算法,同时还有数字签名 功能。DSA算法是数字签名简单,仅为数字签名而设计
      • 实现

        • SH系列(SH224WithDSA,SH256WithDSA,SH384WithDSA,
          SH512WithDSA)
    • 3、ECDSA算法

      • 简述

        1991作为ANSI标准,2000年成为IEEE和NIST的标准。
        ECDSA算法相对传统的算法而言具有速度快,强度高,签名短,其用途也越来越广泛

      • 实现

        • ECDSA算法系列(NONEWithECDSA、RIPEMD160WithECDSA、SHA1WithECDSA、SHA256WithECDSA、SHA384WithECDSA、SHA512WithECDSA)
    展开全文
  • java 加密解密算法MD5/SHA1,DSA

    千次阅读 2021-02-12 14:17:45
    通常,使用的加密算法 比较简便高效,密钥简短,加解密速度快,破译极其困难。本文介绍了 MD5/SHA1,DSA,DESede/DES,Diffie-Hellman的使用。第1章基础知识1.1. 单钥密码体制单钥密码体制是一种传统的加密算法,是指...

    通常,使用的加密算法 比较简便高效,密钥简短,加解密速度快,破译极其困难。本文介绍了 MD5/SHA1,DSA,DESede/DES,Diffie-Hellman的使用。

    第1章基础知识

    1.1. 单钥密码体制

    单钥密码体制是一种传统的加密算法,是指信息的发送方和接收方共同使用同一把密钥进行加解密。

    通常,使用的加密算法比较简便高效,密钥简短,加解密速度快,破译极其困难。但是加密的安全性依靠密钥保管的安全性,在公开的计算机网络上安全地传送和保管密钥是一个严峻的问题,并且如果在多用户的情况下密钥的保管安全性也是一个问题。

    单钥密码体制的代表是美国的DES

    1.2. 消息摘要

    一个消息摘要就是一个数据块的数字指纹。即对一个任意长度的一个数据块进行计算,产生一个唯一指印(对于SHA1是产生一个20字节的二进制数组)。

    消息摘要有两个基本属性:

    两个不同的报文难以生成相同的摘要

    难以对指定的摘要生成一个报文,而由该报文反推算出该指定的摘要

    代表:美国国家标准技术研究所的SHA1和麻省理工学院Ronald Rivest提出的MD5

    1.3. Diffie-Hellman密钥一致协议

    密钥一致协议是由公开密钥密码体制的奠基人Diffie和Hellman所提出的一种思想。

    先决条件,允许两名用户在公开媒体上交换信息以生成"一致"的,可以共享的密钥

    代表:指数密钥一致协议(Exponential Key Agreement Protocol)

    1.4. 非对称算法与公钥体系

    1976 年,Dittie和Hellman为解决密钥管理问题,在他们的奠基性的工作"密码学的新方向"一文中,提出一种密钥交换协议,允许在不安全的媒体上通过通讯双方交换信息,安全地传送秘密密钥。在此新思想的基础上,很快出现了非对称密钥密码体制,即公钥密码体制。在公钥体制中,加密密钥不同于解密密钥,加密密钥公之于众,谁都可以使用;解密密钥只有解密人自己知道。它们分别称为公开密钥(Public key)和秘密密钥(Private key)。

    迄今为止的所有公钥密码体系中,RSA系统是最著名、最多使用的一种。RSA公开密钥密码系统是由R.Rivest、A.Shamir和L.Adleman俊教授于1977年提出的。RSA的取名就是来自于这三位发明者的姓的第一个字母

    1.5. 数字签名

    所谓数字签名就是信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行RSA算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时也确保信息报文在经签名后末被篡改(即完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。

    在数字签名中有重要作用的数字指纹是通过一类特殊的散列函数(HASH函数)生成的,对这些HASH函数的特殊要求是:

    接受的输入报文数据没有长度限制;

    对任何输入报文数据生成固定长度的摘要(数字指纹)输出

    从报文能方便地算出摘要;

    难以对指定的摘要生成一个报文,而由该报文反推算出该指定的摘要;

    两个不同的报文难以生成相同的摘要

    代表:DSA

    05ac63f463130bd1876c1af927ae88a3.png

    c6ccbc96c20bebb0d73e8e6368158ef5.png

    第2章在JAVA中的实现

    2.1. 相关

    Diffie-Hellman密钥一致协议和DES程序需要JCE工具库的支持,可以到 http://java.sun.com/security/index.html 下载JCE,并进行安装。简易安装把 jce1.2.1\lib 下的所有内容复制到 %java_home%\lib\ext下,如果没有ext目录自行建立,再把jce1_2_1.jar和sunjce_provider.jar添加到CLASSPATH内,更详细说明请看相应用户手册

    2.2. 消息摘要MD5和SHA的使用

    使用方法:

    首先用生成一个MessageDigest类,确定计算方法

    Java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");

    添加要进行计算摘要的信息

    alga.update(myinfo.getBytes());

    计算出摘要

    byte[] digesta=alga.digest();

    发送给其他人你的信息和摘要

    其他人用相同的方法初始化,添加信息,最后进行比较摘要是否相同

    algb.isEqual(digesta,algb.digest())

    相关AIP

    java.security.MessageDigest 类

    static getInstance(String algorithm)

    返回一个MessageDigest对象,它实现指定的算法

    参数:算法名,如 SHA-1 或MD5

    void update (byte input)

    void update (byte[] input)

    void update(byte[] input, int offset, int len)

    添加要进行计算摘要的信息

    byte[] digest()

    完成计算,返回计算得到的摘要(对于MD5是16位,SHA是20位)

    void reset()

    复位

    static boolean isEqual(byte[] digesta, byte[] digestb)

    比效两个摘要是否相同

    代码:

    import java.security.*;

    public class myDigest {

    public static void main(String[] args) {

    myDigest my=new myDigest();

    my.testDigest();

    }

    public void testDigest()

    {

    try {

    String myinfo="我的测试信息";

    //java.security.MessageDigest alg=java.security.MessageDigest.getInstance("MD5");

    java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");

    alga.update(myinfo.getBytes());

    byte[] digesta=alga.digest();

    System.out.println("本信息摘要是:"+byte2hex(digesta));

    //通过某中方式传给其他人你的信息(myinfo)和摘要(digesta) 对方可以判断是否更改或传输正常

    java.security.MessageDigest algb=java.security.MessageDigest.getInstance("SHA-1");

    algb.update(myinfo.getBytes());

    if (algb.isEqual(digesta,algb.digest())) {

    System.out.println("信息检查正常");

    }

    else

    {

    System.out.println("摘要不相同");

    }

    }

    catch (java.security.NoSuchAlgorithmException ex) {

    System.out.println("非法摘要算法");

    }

    }

    public String byte2hex(byte[] b) //二行制转字符串

    {

    String hs="";

    String stmp="";

    for (int n=0;n

    {

    stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));

    if (stmp.length()==1) hs=hs+"0"+stmp;

    else hs=hs+stmp;

    if (n

    }

    return hs.toUpperCase();

    }

    }

    2.3. 数字签名DSA

    对于一个用户来讲首先要生成他的密钥对,并且分别保存

    生成一个KeyPairGenerator实例

    java.security.KeyPairGenerator keygen=java.security.KeyPairGenerator.getInstance("DSA");

    如果设定随机产生器就用如相代码初始化

    SecureRandom secrand=new SecureRandom();

    secrand.setSeed("tttt".getBytes()); //初始化随机产生器

    keygen.initialize(512,secrand); //初始化密钥生成器

    否则

    keygen.initialize(512);

    生成密钥公钥pubkey和私钥prikey

    KeyPair keys=keygen.generateKeyPair(); //生成密钥组

    PublicKey pubkey=keys.getPublic();

    PrivateKey prikey=keys.getPrivate();

    分别保存在myprikey.dat和mypubkey.dat中,以便下次不在生成

    (生成密钥对的时间比较长

    java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myprikey.dat"));

    out.writeObject(prikey);

    out.close();

    out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("mypubkey.dat"));

    out.writeObject(pubkey);

    out.close();

    用他私人密钥(prikey)对他所确认的信息(info)进行数字签名产生一个签名数组

    从文件中读入私人密钥(prikey)

    java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("myprikey.dat"));

    PrivateKey myprikey=(PrivateKey)in.readObject();

    in.close();

    初始一个Signature对象,并用私钥对信息签名

    java.security.Signature signet=java.security.Signature.getInstance("DSA");

    signet.initSign(myprikey);

    signet.update(myinfo.getBytes());

    byte[] signed=signet.sign();

    把信息和签名保存在一个文件中(myinfo.dat)

    java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myinfo.dat"));

    out.writeObject(myinfo);

    out.writeObject(signed);

    out.close();

    把他的公钥的信息及签名发给其它用户

    其他用户用他的公共密钥(pubkey)和签名(signed)和信息(info)进行验证是否由他签名的信息

    读入公钥

    java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("mypubkey.dat"));

    PublicKey pubkey=(PublicKey)in.readObject();

    in.close();

    读入签名和信息

    in=new java.io.ObjectInputStream(new java.io.FileInputStream("myinfo.dat"));

    String info=(String)in.readObject();

    byte[] signed=(byte[])in.readObject();

    in.close();

    初始一个Signature对象,并用公钥和签名进行验证

    java.security.Signature signetcheck=java.security.Signature.getInstance("DSA");

    signetcheck.initVerify(pubkey);

    signetcheck.update(info.getBytes());

    if (signetcheck.verify(signed)) { System.out.println("签名正常");}

    对于密钥的保存本文是用对象流的方式保存和传送的,也可可以用编码的方式保存.注意要

    import java.security.spec.*

    import java.security.*

    具休说明如下

    public key是用X.509编码的,例码如下:

    byte[] bobEncodedPubKey=mypublic.getEncoded(); //生成编码

    //传送二进制编码

    //以下代码转换编码为相应key对象

    X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(bobEncodedPubKey);

    KeyFactory keyFactory = KeyFactory.getInstance("DSA");

    PublicKey bobPubKey = keyFactory.generatePublic(bobPubKeySpec);

    对于Private key是用PKCS#8编码,例码如下:

    byte[] bPKCS=myprikey.getEncoded();

    //传送二进制编码

    //以下代码转换编码为相应key对象

    PKCS8EncodedKeySpec priPKCS8=new PKCS8EncodedKeySpec(bPKCS);

    KeyFactory keyf=KeyFactory.getInstance("DSA");

    PrivateKey otherprikey=keyf.generatePrivate(priPKCS8);

    常用API

    java.security.KeyPairGenerator 密钥生成器类

    public static KeyPairGenerator getInstance(String algorithm) throws NoSuchAlgorithmException

    以指定的算法返回一个KeyPairGenerator 对象

    参数: algorithm 算法名.如:"DSA","RSA"

    public void initialize(int keysize)

    以指定的长度初始化KeyPairGenerator对象,如果没有初始化系统以1024长度默认设置

    参数:keysize 算法位长.其范围必须在 512 到 1024 之间,且必须为 64 的倍数

    public void initialize(int keysize, SecureRandom random)

    以指定的长度初始化和随机发生器初始化KeyPairGenerator对象

    参数:keysize 算法位长.其范围必须在 512 到 1024 之间,且必须为 64 的倍数

    random 一个随机位的来源(对于initialize(int keysize)使用了默认随机器

    public abstract KeyPair generateKeyPair()

    产生新密钥对

    java.security.KeyPair 密钥对类

    public PrivateKey getPrivate()

    返回私钥

    public PublicKey getPublic()

    返回公钥

    java.security.Signature 签名类

    public static Signature getInstance(String algorithm) throws NoSuchAlgorithmException

    返回一个指定算法的Signature对象

    参数 algorithm 如:"DSA"

    public final void initSign(PrivateKey privateKey)

    throws InvalidKeyException

    用指定的私钥初始化

    参数:privateKey 所进行签名时用的私钥

    public final void update(byte data)

    throws SignatureException

    public final void update(byte[] data)

    throws SignatureException

    public final void update(byte[] data, int off, int len)

    throws SignatureException

    添加要签名的信息

    public final byte[] sign()

    throws SignatureException

    返回签名的数组,前提是initSign和update

    public final void initVerify(PublicKey publicKey)

    throws InvalidKeyException

    用指定的公钥初始化

    参数:publicKey 验证时用的公钥

    public final boolean verify(byte[] signature)

    throws SignatureException

    验证签名是否有效,前提是已经initVerify初始化

    参数: signature 签名数组

    */

    import java.security.*;

    import java.security.spec.*;

    public class testdsa {

    public static void main(String[] args) throws java.security.NoSuchAlgorithmException,java.lang.Exception {

    testdsa my=new testdsa();

    my.run();

    }

    public void run()

    {

    //数字签名生成密钥

    //第一步生成密钥对,如果已经生成过,本过程就可以跳过,对用户来讲myprikey.dat要保存在本地

    //而mypubkey.dat给发布给其它用户

    if ((new java.io.File("myprikey.dat")).exists()==false) {

    if (generatekey()==false) {

    System.out.println("生成密钥对败");

    return;

    };

    }

    //第二步,此用户

    //从文件中读入私钥,对一个字符串进行签名后保存在一个文件(myinfo.dat)中

    //并且再把myinfo.dat发送出去

    //为了方便数字签名也放进了myifno.dat文件中,当然也可分别发送

    try {

    java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("myprikey.dat"));

    PrivateKey myprikey=(PrivateKey)in.readObject();

    in.close();

    // java.security.spec.X509EncodedKeySpec pubX509=new java.security.spec.X509EncodedKeySpec(bX509);

    //java.security.spec.X509EncodedKeySpec pubkeyEncode=java.security.spec.X509EncodedKeySpec

    String myinfo="这是我的信息"; //要签名的信息

    //用私钥对信息生成数字签名

    java.security.Signature signet=java.security.Signature.getInstance("DSA");

    signet.initSign(myprikey);

    signet.update(myinfo.getBytes());

    byte[] signed=signet.sign(); //对信息的数字签名

    System.out.println("signed(签名内容)="+byte2hex(signed));

    //把信息和数字签名保存在一个文件中

    java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myinfo.dat"));

    out.writeObject(myinfo);

    out.writeObject(signed);

    out.close();

    System.out.println("签名并生成文件成功");

    }

    catch (java.lang.Exception e) {

    e.printStackTrace();

    System.out.println("签名并生成文件失败");

    };

    //第三步

    //其他人通过公共方式得到此户的公钥和文件

    //其他人用此户的公钥,对文件进行检查,如果成功说明是此用户发布的信息.

    //

    try {

    java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("mypubkey.dat"));

    PublicKey pubkey=(PublicKey)in.readObject();

    in.close();

    System.out.println(pubkey.getFormat());

    in=new java.io.ObjectInputStream(new java.io.FileInputStream("myinfo.dat"));

    String info=(String)in.readObject();

    byte[] signed=(byte[])in.readObject();

    in.close();

    java.security.Signature signetcheck=java.security.Signature.getInstance("DSA");

    signetcheck.initVerify(pubkey);

    signetcheck.update(info.getBytes());

    if (signetcheck.verify(signed)) {

    System.out.println("info="+info);

    System.out.println("签名正常");

    }

    else System.out.println("非签名正常");

    }

    catch (java.lang.Exception e) {e.printStackTrace();};

    }

    //生成一对文件myprikey.dat和mypubkey.dat---私钥和公钥,

    //公钥要用户发送(文件,网络等方法)给其它用户,私钥保存在本地

    public boolean generatekey()

    {

    try {

    java.security.KeyPairGenerator keygen=java.security.KeyPairGenerator.getInstance("DSA");

    // SecureRandom secrand=new SecureRandom();

    // secrand.setSeed("tttt".getBytes()); //初始化随机产生器

    // keygen.initialize(576,secrand); //初始化密钥生成器

    keygen.initialize(512);

    KeyPair keys=keygen.genKeyPair();

    // KeyPair keys=keygen.generateKeyPair(); //生成密钥组

    PublicKey pubkey=keys.getPublic();

    PrivateKey prikey=keys.getPrivate();

    java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myprikey.dat"));

    out.writeObject(prikey);

    out.close();

    System.out.println("写入对象 prikeys ok");

    out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("mypubkey.dat"));

    out.writeObject(pubkey);

    out.close();

    System.out.println("写入对象 pubkeys ok");

    System.out.println("生成密钥对成功");

    return true;

    }

    catch (java.lang.Exception e) {

    e.printStackTrace();

    System.out.println("生成密钥对失败");

    return false;

    };

    }

    public String byte2hex(byte[] b)

    {

    String hs="";

    String stmp="";

    for (int n=0;n

    {

    stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));

    if (stmp.length()==1) hs=hs+"0"+stmp;

    else hs=hs+stmp;

    if (n

    }

    return hs.toUpperCase();

    }

    }

    2.4. DESede/DES对称算法

    首先生成密钥,并保存(这里并没的保存的代码,可参考DSA中的方法)

    KeyGenerator keygen = KeyGenerator.getInstance(Algorithm);

    SecretKey deskey = keygen.generateKey();

    用密钥加密明文(myinfo),生成密文(cipherByte)

    Cipher c1 = Cipher.getInstance(Algorithm);

    c1.init(Cipher.ENCRYPT_MODE,deskey);

    byte[] cipherByte=c1.doFinal(myinfo.getBytes());

    传送密文和密钥,本文没有相应代码可参考DSA

    .............

    用密钥解密密文

    c1 = Cipher.getInstance(Algorithm);

    c1.init(Cipher.DECRYPT_MODE,deskey);

    byte[] clearByte=c1.doFinal(cipherByte);

    相对来说对称密钥的使用是很简单的,对于JCE来讲支技DES,DESede,Blowfish三种加密术

    对于密钥的保存各传送可使用对象流或者用二进制编码,相关参考代码如下

    SecretKey deskey = keygen.generateKey();

    byte[] desEncode=deskey.getEncoded();

    javax.crypto.spec.SecretKeySpec destmp=new javax.crypto.spec.SecretKeySpec(desEncode,Algorithm);

    SecretKey mydeskey=destmp;

    相关API

    KeyGenerator 在DSA中已经说明,在添加JCE后在instance进可以如下参数

    DES,DESede,Blowfish,HmacMD5,HmacSHA1

    javax.crypto.Cipher 加/解密器

    public static final Cipher getInstance(java.lang.String transformation)

    throws java.security.NoSuchAlgorithmException,

    NoSuchPaddingException

    返回一个指定方法的Cipher对象

    参数:transformation 方法名(可用 DES,DESede,Blowfish)

    public final void init(int opmode, java.security.Key key)

    throws java.security.InvalidKeyException

    用指定的密钥和模式初始化Cipher对象

    参数:opmode 方式(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)

    key 密钥

    public final byte[] doFinal(byte[] input)

    throws java.lang.IllegalStateException,

    IllegalBlockSizeException,

    BadPaddingException

    对input内的串,进行编码处理,返回处理后二进制串,是返回解密文还是加解文由init时的opmode决定

    注意:本方法的执行前如果有update,是对updat和本次input全部处理,否则是本inout的内容

    /*

    安全程序 DESede/DES测试

    */

    import java.security.*;

    import javax.crypto.*;

    public class testdes {

    public static void main(String[] args){

    testdes my=new testdes();

    my.run();

    }

    public void run() {

    //添加新安全算法,如果用JCE就要把它添加进去

    Security.addProvider(new com.sun.crypto.provider.SunJCE());

    String Algorithm="DES"; //定义 加密算法,可用 DES,DESede,Blowfish

    String myinfo="要加密的信息";

    try {

    //生成密钥

    KeyGenerator keygen = KeyGenerator.getInstance(Algorithm);

    SecretKey deskey = keygen.generateKey();

    //加密

    System.out.println("加密前的二进串:"+byte2hex(myinfo.getBytes()));

    System.out.println("加密前的信息:"+myinfo);

    Cipher c1 = Cipher.getInstance(Algorithm);

    c1.init(Cipher.ENCRYPT_MODE,deskey);

    byte[] cipherByte=c1.doFinal(myinfo.getBytes());

    System.out.println("加密后的二进串:"+byte2hex(cipherByte));

    //解密

    c1 = Cipher.getInstance(Algorithm);

    c1.init(Cipher.DECRYPT_MODE,deskey);

    byte[] clearByte=c1.doFinal(cipherByte);

    System.out.println("解密后的二进串:"+byte2hex(clearByte));

    System.out.println("解密后的信息:"+(new String(clearByte)));

    }

    catch (java.security.NoSuchAlgorithmException e1) {e1.printStackTrace();}

    catch (javax.crypto.NoSuchPaddingException e2) {e2.printStackTrace();}

    catch (java.lang.Exception e3) {e3.printStackTrace();}

    }

    public String byte2hex(byte[] b) //二行制转字符串

    {

    String hs="";

    String stmp="";

    for (int n=0;n

    {

    stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));

    if (stmp.length()==1) hs=hs+"0"+stmp;

    else hs=hs+stmp;

    if (n

    }

    return hs.toUpperCase();

    }

    }

    2.5. Diffie-Hellman密钥一致协议

    公开密钥密码体制的奠基人Diffie和Hellman所提出的 "指数密钥一致协议"(Exponential Key Agreement Protocol),该协议不要求

    展开全文
  • 主要介绍了PHP实现的简单AES加密解密算法,结合具体实例形式分析了php基于mcrypt_encrypt、bin2hex、mcrypt_decrypt等方法进行字符串加密解密的相关操作技巧,需要的朋友可以参考下
  • 本文实例讲述了php的RSA加密解密算法原理与用法。分享给大家供大家参考,具体如下: 最近因为工作的需要,要倒腾支付宝支付相关的知识,因为支付宝应用了RSA加密机制,个人对此并不了解,所以在这里写下一篇总结。 1...
  • C#实现字符串SHA-256加密算法,非常好用,供大家学习参考。
  • 对于需要还原的信息,则需要采用可逆的加密解密算法。 下面一组PHP函数是实现此加密解密的方法: 加密算法如下:复制代码 代码如下:function encrypt($data, $key){ $key = md5($key); $x = 0; $len = ...
  • 包括(SHA算法,HMAC算法,DES算法,PBE算法,AES算法,RSA算法,数字签名,D-H算法等)
  • 用于微信小程序中所需要的SHA256加密,放在小程序里面使用,不用改动
  • 网上找的asp sha1加密是64位,还以为asp.net做了截取(如网上的asp的md5机密和asp.net位数不一样,是做了截取的问题),但是asp的64位加密结果并没有包含asp.net的40位结果,看来找到的版本和asp.net的加密算法不...
  • 加密解密算法工具集

    热门讨论 2018-05-17 18:47:32
    自己写的非常强大的一个加密解密工具,有DES、3DES(含ECB和CBC)、RSA、SHA1、SHA256、SHA512、MD5、CRC、base64、异或运算等
  • SHA-1加密解密 特征

    2021-01-08 05:45:50
    算法简介: 安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生...
  • JAVA实现的sha256加密算法

    热门讨论 2012-05-08 01:03:29
    java实现的sha256加密算法
  • python实现sha1加密算法

    千次阅读 2022-03-23 05:38:04
    使用sha1加密算法,返回str加密后的字符串 """ def sha1_secret_str(s: str): import hashlib sha = hashlib.sha1(s.encode('utf-8')) encrypts = sha.hexdigest() return encrypts 二、调用测试 if __name__...
  • aes JS 加密解密算法

    2018-01-12 09:37:40
    JS aes 各种加密解密算法,并且里面有个aes的简单实现.
  • ## 说明 此程序可以进行sha1,sha256,md5的加密 在input输入框内输入所需加密的数据,然后点击"encryption"按扭即可实现加密; 默认input输入框内的数据为123456
  • 2012年10月,美国NIST选择了Keccak算法作为SHA - 3的标准算法,Keccak拥有良好的加密性能以及抗解密能力。 测试说明 测试代码由makefile进行管理 将整个文件夹拷贝到Linux目录下,使用gcc编译 编译运行步骤: 1、在...
  • 常见数据加密解密算法(特征值)

    千次阅读 2021-11-23 16:35:50
    TEA加密/解密算法(特征值9e3779b9) 加密核心函数 void EncryptTEA(unsigned int *firstChunk, unsigned int *secondChunk, unsigned int* key) { unsigned int y = *firstChunk; unsigned int z = *secondChunk...
  • sha256算法,能实现sha256的加密功能,希望大家喜欢
  • Java&Android; SHA1、SHA-512、SHA-384等加密算法工具类
  • 一些常见的加密解密算法和摘要算法源码,如SHA1,CRC32,IDEA,AES等,与大家分享一下,希望对大家有帮助。
  • JWT加密解密算法

    千次阅读 2021-04-30 22:26:30
    该信息可以被验证和信任,因为它将使用数字签名(密钥)记性加密解密。 什么时候使用JWT Authorization (授权) : 这是JWT最常见的使用场景,一旦用户登录后,后面每个请求都将包含JWT,用户将被允许访问该令牌允许...
  • C字符串简易加密解密算法

    千次阅读 2021-05-23 12:28:21
    一、 问题描述对一个指定的字符串进行加密之后,利用解密函数能后对密文解密显示明文信息,这里定义加密的规则:是将字符串中每个字符加上它在字符串中的位置和一个偏移值。例如:将字符串“mrsoft”为例子第一个字符...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,936
精华内容 15,174
关键字:

sha加密解密算法