精华内容
下载资源
问答
  • 最近突发奇想要往数据库里保存一些机密的东西,然后就想着怎么让别人即使进入到了数据库也看不懂存储的是什么,那么只有加密了;可是我们自己还要看呢,那只能找一些对称...下面就介绍了php中简单的对称加密算法实现。
  • 主要介绍了Java实现的对称加密算法AES,结合实例形式分析了对称加密算法AES的定义、特点、用法及使用场景,需要的朋友可以参考下
  • 主要介绍了JAVA加密算法- 非对称加密算法(DH,RSA),详细介绍了DH,RSA的用法和示例,需要的朋友可以了解一下。
  • visual c++ vc实现RSA加密算法是最常用的非对称加密算法.zip
  • java关于加密的算法demo代码(Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法) JAVA安全实现三种方式: 1.JDK 2.Commons Codec 3.Bouncy Castle 一。非对称加密算法: 1.DH 2.RSA 3.ELGamal 二。...
  • 对称加密:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES 非对称加密:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)
  • C语言实现国密SM4对称加解密算法。编译环境:VS2010。请参考我的博客https://blog.csdn.net/u013073067/article/details/86578753 分析代码
  • 主要介绍了C#实现简单的RSA非对称加密算法,结合实例形式分析了C#实现RSA加密的具体步骤与相关操作技巧,需要的朋友可以参考下
  • AES/DES 对称加密算法

    2018-12-25 14:04:55
    DES、AES对称加密算法,之前从网上找的,但是在MAC上运行发现每次加密出来的结果都不一样,后来查了一些博客,最后确认是SecureRandom的随机算法问题,需要设置setSeed.
  • 分享一个PHP对称加密算法DES,AES类,支持密钥:64/128/256 bit(字节长度8/16/32),支持算法:DES/AES(根据密钥长度自动匹配使用:DES:64bit AES:128/256bit)。
  • DES算法为密码体制中的对称密码体制,是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。 这里以Java代码实现DES算法。
  • C语言实现AES-128对称加解密算法。编译环境:VS2010。请参考我的博客https://blog.csdn.net/u013073067/article/details/86529111 分析代码
  • 主要介绍了Java对称加密算法DES,结合实例形式详细分析了java DES算法的概念、原理、实现方法与应用场景,需要的朋友可以参考下
  • java rsa非对称加密算法3个实例源代码
  • 常见对称加密算法

    千次阅读 2019-04-10 09:13:49
    目前在后台架构中,常用的有对称加密算法和飞对称加密算法。 + 加密应用场景:敏感信息加密,比如,证件号码,银行卡账号,邮件信息,聊天记录cookie信息,私钥保护等等。 常见的对称加密算法有: 常用算法介绍 ...

    数据加密的本质就是对原始信息内容进行混淆和隐藏,使其难于理解,或难遇反向解密,或者利用现有的技术无法在短时间内破解,从而达到保障信息不被泄露的目的。目前在后台架构中,常用的有对称加密算法和飞对称加密算法。

    +

    加密应用场景:敏感信息加密,比如,证件号码,银行卡账号,邮件信息,聊天记录cookie信息,私钥保护等等。

    常见的对称加密算法有:

    常用算法介绍

    • DES: Data Encryption Standard,即数据加密标准,是一种历史比较悠久的加密算法,上世纪70年代就在使用,是由IBM公司设计的算法,并被美国政府于1976年确定为国家标准局确定为联邦资料处理标准,这种加密算法再七八十年代广为流传,但随着计算机硬件的指数级发展,处理能力不断提高,DES 加密算法已经不再安全,早在 1999年,就有组织宣称使用在23小时之内成功破解了,使用64位数据块,这主要是由于DES算法的秘钥太短,只有56位,很容易通过暴力方式破解。目前,DES算法已经被AES算法所取代。

    • 3DES:三重数据加密算法,Triple DES,也叫三级DES。3DES 不算是一种新的加密算法,它相当于在DES加密算法之上做的增强。由于DES算法本身的短秘钥容易被暴力破解,所以3DES通过增加DES的秘钥长度,使用3个56位的秘钥对数据进行加密,从而能够增强安全性,延缓暴力破解的可能。但加密效率会更慢,3DES被认为是DES向AES发展的过度算法。

    • Blowfish:Blowfish 是 Bruce Schneider 于1993 年设计的。Blowfish 的采用变长1到448位的变长秘钥,给用户比较大的灵活性,相比于DES算法在保证安全性的公式,有很好的加密效率。Bruce Schneider 发明之初一方面是为了摒弃DES算法的老化,一方面是为了缓解加密算法的垄断,因为当时大部分的加密算法都被商业机构或者政府所掌握,有专利保护,所以发展受限,而该算法该算法是完全可以免费的,任何人都可以试用,所以Blowfish 算法有很广泛的应用。

    • AES:Advanced Encryption Standard 即高级加密标准,高级加密标准由美国国家标准与技术研究院(NIST)在2001年提出,ASE算法是目前相对较新,也是目前最流行的对称加密算法,速度更快,安全性更好,被认为是 DES 的替代者。AES 使用128位的加密块,使用128,192和256位长度的秘钥,都是字节的倍数,如果数据块或秘钥长度不足,算法会补齐所以易于软件和硬件的实现。而且某些处理器支持AES硬件加速,比如 Intel 推出的 AES-NI 指令集( Advanced Encryption Standard New Instructions),是专门用户针对AES加密算法硬件CPU指令集,可以让AES加解密速度大幅提升,目前AMD 和 SPARC 的 CPU 也支持AES 硬件加速,查看CPU是否支持AES指令,可以通过命令查看,如: 出现 aes 字样,表示支持。

      # grep -o aes -m1 -i /proc/cpuinfo
      aes
      

      参考:https://yq.aliyun.com/articles/64343

    查看Java是否支持AES-NI加速,UseAESIntrinsics 位 true 表示支持。

    $ java -XX:+PrintFlagsFinal -version | grep -i aes
    bool UseAES = true {product}
    bool UseAESIntrinsics = true {product}
    java version "1.8.0_141"
    Java(TM) SE Runtime Environment (build 1.8.0_141-b15)
    Java HotSpot(TM) 64-Bit Server VM (build 25.141-b15, mixed mode)
    

    UseAES 和 UseAESIntrinsics 的介绍可以参考:http://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html。 。http://aub.iteye.com/blog/1133494

    在互联网后台技术架构中,多数是以短文本的加密解密为主,我们测试一下对于相同的内容,不同加密算法的性能:

    测试环境为:MacBook Pro,Intel CPU 2.6Ghz(支持AES-NI指令集),内存 16G。 系统环境:JDK 1.8,OSX 10.12.5

    测试代码如下:

    package com.github.coderxing.book.code.chapter6;
    
    import java.security.Key;
    
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    
    /**
     * 常用对称加密算法性能测试
     */
    public class CipherTest {
    
        private static final int LOOP = 50000;
    
        public static String ALGORITHM_DES = "DES";
        public static String ALGORITHM_3DES = "DESede"; // 3DES
        public static String ALGORITHM_BLOWFISH = "Blowfish";
        public static String ALGORITHM_AES = "AES";
    
        public static Key keyGenerator(String algorithm, int n) throws Exception {
            KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
            keyGenerator.init(n);
            return keyGenerator.generateKey();
        }
    
        // 加密方法
        public static byte[] encrypt(Key key, String text, String algorithm) throws Exception {
            // ECB是分组模式,PKCS5Padding 是补全策略
            Cipher cipher = Cipher.getInstance(algorithm + "/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, key);
            return cipher.doFinal(text.getBytes());
        }
    
        // 解密方法
        public static byte[] decrypt(Key key, byte[] data, String algorithm) throws Exception {
            Cipher cipher = Cipher.getInstance(algorithm + "/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, key);
            return cipher.doFinal(data);
        }
    
        // 测试加密速度
        public static void testEncrypt(String text, String algorithm, int bit) throws Exception {
            Key key = keyGenerator(algorithm, bit);
            long startTs = System.currentTimeMillis();
    
            for (int i = 0; i < LOOP; i++) {
                encrypt(key, text, algorithm);
            }
            long endTs = System.currentTimeMillis();
            System.out.println(algorithm + " (" + bit + "位秘钥) 加密平均耗时 " + ((endTs - startTs) / (double) LOOP) + " ms");
        }
    
        public static void testDecrypt(String text, String algorithm, int bit) throws Exception {
            Key key = keyGenerator(algorithm, bit);
            long startTs = System.currentTimeMillis();
    
            byte[] encrypted = encrypt(key, text, algorithm);
    
            for (int i = 0; i < LOOP; i++) {
                decrypt(key, encrypted, algorithm);
            }
            long endTs = System.currentTimeMillis();
            System.out.println(algorithm + " (" + bit + "位秘钥) 解密平均耗时 " + ((endTs - startTs) / (double) LOOP) + " ms");
        }
    
        public static void main(String[] args) throws Exception {
            String passwordText = "这是我的信用卡账号 5555 5555 5555 5555";
    
            // DES 算法仅支持56位定长秘钥
            testEncrypt(passwordText, ALGORITHM_DES, 56);
            testDecrypt(passwordText, ALGORITHM_DES, 56);
    
            // 3DES 算法仅支持112位和168位秘钥
            testEncrypt(passwordText, ALGORITHM_3DES, 112);
            testDecrypt(passwordText, ALGORITHM_3DES, 112);
    
            testEncrypt(passwordText, ALGORITHM_3DES, 168);
            testDecrypt(passwordText, ALGORITHM_3DES, 168);
    
            // Blowfish 算法支持32 到 448位的变长秘钥
            testEncrypt(passwordText, ALGORITHM_BLOWFISH, 32);
            testDecrypt(passwordText, ALGORITHM_BLOWFISH, 32);
    
            testEncrypt(passwordText, ALGORITHM_BLOWFISH, 256);
            testDecrypt(passwordText, ALGORITHM_BLOWFISH, 256);
    
            testEncrypt(passwordText, ALGORITHM_BLOWFISH, 448);
            testDecrypt(passwordText, ALGORITHM_BLOWFISH, 448);
    
            // AES 算法支持 128,192,256 三种定长秘钥
            testEncrypt(passwordText, ALGORITHM_AES, 128);
            testDecrypt(passwordText, ALGORITHM_AES, 128);
    
            testEncrypt(passwordText, ALGORITHM_AES, 192);
            testDecrypt(passwordText, ALGORITHM_AES, 192);
    
            testEncrypt(passwordText, ALGORITHM_AES, 256);
            testDecrypt(passwordText, ALGORITHM_AES, 256);
    
        }
    }
    

    代码中分别对各种算法的加解密过程执行 50000,取平均执行时间,耗时结果如下:

    DES (56位秘钥) 加密平均耗时 0.0081 ms DES (56位秘钥) 解密平均耗时 0.0062 ms DESede (112位秘钥) 加密平均耗时 0.00972 ms DESede (112位秘钥) 解密平均耗时 0.0082 ms DESede (168位秘钥) 加密平均耗时 0.01074 ms DESede (168位秘钥) 解密平均耗时 0.00782 ms Blowfish (32位秘钥) 加密平均耗时 0.04542 ms Blowfish (32位秘钥) 解密平均耗时 0.04456 ms Blowfish (256位秘钥) 加密平均耗时 0.04524 ms Blowfish (256位秘钥) 解密平均耗时 0.04528 ms Blowfish (448位秘钥) 加密平均耗时 0.04552 ms Blowfish (448位秘钥) 解密平均耗时 0.04522 ms AES (128位秘钥) 加密平均耗时 0.006 ms AES (128位秘钥) 解密平均耗时 0.00552 ms AES (192位秘钥) 加密平均耗时 0.00614 ms AES (192位秘钥) 解密平均耗时 0.00562 ms AES (256位秘钥) 加密平均耗时 0.00784 ms AES (256位秘钥) 解密平均耗时 0.0061 ms

    以上结果是在我们的笔记本电脑上的测试结果,具体性能如何还要读者在自己的环境中实测。如果你不知道选择什么对称加密算法,推荐使用AES,无论是在性能还是在安全性上都有保障。

    注意: 由于美国对软件出口的限制,默认情况下,使用上诉算法的秘钥不能找过128位,如果超过,就会抛出“Java.security.InvalidKeyException: Illegal key size or default paramet” 异常。 Oracle在其官方网站上提供了无政策限制权限文件(Unlimited Strength Jurisdiction Policy Files),需要手动下载,并体替换的掉 替换 <JDK安装目录>/jre/lib/security/ 下面的local_policy.jar和US_export_policy.jar 两个文件。 java8 对应的下载地址为:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html。

    算法分组

    另外,再选择算法之后,还要选择分组模式,算法是基于固定长度(比如AES的加密数据块的大小是128位)的内容进行加密,如果要加密的数据超过了算法支持的数据块长度,就需要讲数据进行切分,分别进行加密,如果切分后不是分块长度的整数,对于。以AES算法为例,有 ECB, CBC等模式。

    ECB(Electronic codebook,电子密码本)是一种基础模式,其在加解密的时候,讲原始数据按照加密算的的块大小分成若干的组,如果不足则补全,再对每个组单独进行加密解密,其过程如下图所示:

    (https://zh.wikipedia.org/wiki/分组密码工作模式) 图片来自维基百科。

    该模式的缺点是同样的明文快加密后会形成相同的密文块,明文块和密文块之间有明显的一一对应关系,每一块之间相互独立,互补干扰,不能保证数据的完整性,为数据篡改提供了可能,攻击者可以已知的明文来构建确定的密文,而且建立一套明文密文字典对照表,通过重放,可以对信息片段进行篡改,或者通过反查翻译明文信息。维基百科上举过一个例子(这里加引用):““梦幻之星在线:蓝色脉冲”在线电子游戏使用ECB模式的Blowfish密码。在密钥交换系统被破解而产生更简单的破解方式前,作弊者重复通过发送加密的“杀死怪物”消息包以非法的快速增加经验值”(参考https://zh.wikipedia.org/wiki/分组密码工作模式) 所以,相比于其他模式,这种模式速度快,但是所以不能很好的隐藏数据,数据保护程度不够严格,实际项目中不建议使用。

    CBC模式(CBC,Cipher-block chaining)是ECB模式的改进,这种模式是应用最广的一种模式,在该模式中,每一个明文数据块再加密前,都要和前一个密文数据块进行抑或计算,然后在讲计算结果进行加密计算,这样每一位的改变都会造成整个密文的改变,这样就使得数据片段之间联系起来,起到了防止篡改的作用。第一块明文没有前置密文,所以需要提供个预设值和它进行抑或计算,这个值被称作“初始”向量,CBC模式的计算过程如下图(来自维基百科):

    (https://zh.wikipedia.org/wiki/%E5%88%86%E7%BB%84%E5%AF%86%E7%A0%81%E5%B7%A5%E4%BD%9C%E6%A8%A1%E5%BC%8F)

    图片来自维基百科。

    另外,为了安全期间,在key不变的情况下(有些情况下,key不是由业务团队管理,key统一由安全团队分配,不能随意创建,比如一个业务应用只能有一个key),初始向量最好使用随机值,每次加密的结果都不一样,否则也会出现ECB同样的问题,如果初始向量固定的话,固定的明文输出固定的密文,也会为攻击者提提供构建明文密文对照表的可能,尤其是针对首个分组块的预测。所以,建议加解密双方约定好,使用相同的方式创建随机初始向量,比如按照用户维度,每个用户产生一个随机初始向量,或者时间维度,一段时间内使用一个初始向量,或者一个文件一个唯一随机向量,或者按照回话ID生产,确保回话内唯一等等, 从而降低初始向量的预测性,为了加强安全性,秘钥和随机向量最好分开存储,比如秘钥又安全团队管理,随机向量由业务团队负责存储管理。

    
    import java.security.Key;
    import java.security.SecureRandom;
    import java.util.Base64;
    
    import javax.crypto.Cipher;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    
    /**
     * 常用对称加密算法性能测试
     *
     * 注意:如果抛出 “Java.security.InvalidKeyException: Illegal key size or default
     * paramet 异常。” 请到 Oracle 官网下载无政策限制权限文件(Unlimited Strength Jurisdiction Policy
     * Files)
     *
     * Java8
     * 对应的下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
     *
     * @author chenghao
     *
     */
    public class CipherAES_CBC {
    
        public static Key genKey(String key) throws Exception {
            SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
            return secretKey;
        }
    
        // 生产随机初始向量
        public static IvParameterSpec genRandomIV() throws Exception {
            byte[] randomBytes = new byte[16];
            SecureRandom r = new SecureRandom();
            r.nextBytes(randomBytes);
            IvParameterSpec iv = new IvParameterSpec(randomBytes);
            return iv;
        }
    
        // 加密方法
        public static byte[] encrypt(Key key, String text, IvParameterSpec iv) throws Exception {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, key, iv);
            return cipher.doFinal(text.getBytes());
        }
    
        // 解密方法
        public static byte[] decrypt(Key key, byte[] data, IvParameterSpec iv) throws Exception {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, key, iv);
            return cipher.doFinal(data);
        }
    
        public static void main(String[] args) throws Exception {
            // 明文
            String text = "行用卡账号:4567 8910 1112 1314";
    
            // 128位16字节的秘钥,AES 只支持 128 192 和 256 位的三种秘钥,否则会报错
            String keyStr = "r3pNS{>Zpk-t=h54";
            Key key = genKey(keyStr);
    
            byte[] randomBytes = new byte[16];
            SecureRandom r = new SecureRandom();
            r.nextBytes(randomBytes);
    
            IvParameterSpec iv = new IvParameterSpec(randomBytes);
    
            // 加密
            byte[] encrypted = encrypt(key, text, iv);
    
            // 解密
            byte[] decrypted = decrypt(key, encrypted, iv);
    
            System.out.println("秘钥 : " + keyStr);
            System.out.println("初始向量(base64编码): " + Base64.encodeBase64String(iv.getIV()));
            System.out.println("加密后密文(base64编码): " + Base64.encodeBase64String(encrypted));
            System.out.println("解密后明文:" + new String(decrypted));
    
        }
    }
    

    第一次执行结果:

    秘钥 : r3pNS{>Zpk-t=h54
    初始向量(base64编码): zo7q8GArDVXdV5XvorDwuw==
    加密后密文(base64编码): vIso8PhszZ7Fi6wBsSs9RsKVb9e3np543nuVQ2MSricJ+4LJM4rlV8rByK0C1l0m
    解密后明文:行用卡账号:4567 8910 1112 1314
    

    第二次执行结果:

    秘钥 : r3pNS{>Zpk-t=h54
    初始向量(base64编码): wnfY45w8tGxp5ptXobCd5g==
    加密后密文(base64编码): cy26/wRva2ieEG/kfqpr46PrOh1jJ+dCtXxLbh2A4UaBln/B8ateFyvLGotFYXyX
    解密后明文:行用卡账号:4567 8910 1112 1314
    

    可见,每次加密结果都不一样,这就有效防止了信息字典攻击的威胁。

     

    原文地址:https://coderxing.gitbooks.io/architecture-evolution/di-san-pian-ff1a-bu-luo/642-shu-ju-jia-mi/6421-chang-jian-dui-cheng-jia-mi-suan-fa.html

    展开全文
  • 对称加密算法和非对称加密算法

    千次阅读 2020-10-15 17:47:18
    常用的对称加密算法:AES,RC4,3DES 传输的示意图如下所示: 第二 、非对称加密: 非对称加密算法实现机密信息交换的基本过程是: 甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开; 得到该公用密钥的...

    第一 对称加密:

    对称加密是指,加密方和解密方使用同样的秘钥来进行加密和解密。

    在对称加密算法中,数据发信方将明文( 原始数据 )和加密 密钥 (mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。

    常用的对称加密算法:AES,RC4,3DES

    传输的示意图如下所示:

     

    第二 、非对称加密:

    非对称加密算法实现机密信息交换的基本过程是:

    1. 甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;
    2. 得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;
    3. 甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。
    4. 甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。

    非对称加密算法:RSA,DSA/DSS 

    用通俗易懂的话来解释非对称加密:

    看一个小时候经常在《趣味数学》这类书里的一个数学小魔术:

    让对方任意想一个3位数,并把这个数和91相乘,然后告诉我积的最后三位数,我就可以猜出对方想的是什么数字啦!比如对方想的是123,那么对方就计算出123 * 91等于11193,并把结果的末三位193告诉我。看起来,这么做似乎损失了不少信息,让我没法反推出原来的数。不过,我仍然有办法:只需要把对方告诉我的结果再乘以11,乘积的末三位就是对方刚开始想的数了。可以验证一下,193 * 11 = 2123,末三位正是对方所想的秘密数字!

    其实道理很简单,91乘以11等于1001,而任何一个三位数乘以1001后,末三位显然都不变(例如123乘以1001就等于123123)。

    知道原理后,我们可以构造一个定义域和值域更大的加密解密系统。比方说,任意一个数乘以400000001后,末8位都不变,而400000001 = 19801 * 20201,于是你来乘以19801,我来乘以20201,又一个加密解密不对称的系统就构造好了。

    甚至可以构造得更大一些:4000000000000000000000000000001 = 1199481995446957 * 3334772856269093,这样我们就成功构造了一个30位的加密系统。

    这是一件非常coooooooool的事情,任何人都可以按照我公布的方法加密一个数,但是只有我才知道怎么把所得的密文变回去。

    其安全性就建立在算乘积非常容易,但是要把4000000000000000000000000000001分解成后面两个数相乘,在没有计算机的时代几乎不可能成功!但如果仅仅按照上面的思路,如果对方知道原理,知道我要构造出带很多0的数,根据19801和8位算法这2个条件非常容易穷举出400000001这个目标值。

    要解决这个问题,真实世界就不是使用乘法了,比如RSA算法使用的是指数和取模运算,但本质上就是上面这套思想。

    传输的示意图如下所示:

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

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

     

    非对称和对称完美结合

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

    如上图所示

    1. 第 ③ 步时,客户端说:(咱们后续回话采用对称加密吧,这是对称加密的算法和对称密钥)这段话用公钥进行加密,然后传给服务器
    2. 服务器收到信息后,用私钥解密,提取出对称加密算法和对称密钥后,服务器说:(好的)对称密钥加密
    3. 后续两者之间信息的传输就可以使用对称加密的方式了

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

    展开全文
  • SM4(国产对称加密算法) ,支持ECB和CBC两种加密模式,支持base64和HEX两种加密格式输出。兼容java
  • 对称加密AES算法,实现前后端加密解密,前端使用cryptojs.js实现,后端使用java实现
  • 主要介绍了Java 对称加密使用DES / 3DES / AES 这三种算法分别实现的相关资料,这里提供了实例代码,需要的朋友可以参考下
  • 本文介绍了OpenSSL对称加密算法中添加新算法的方法。
  • 主要介绍了java 非对称加密算法RSA实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 本文主要介绍对称加密算法(symmetric encryption algorithm)和非对称加密算法(asymmetric cryptographic algorithm)的相关知识。 1 对称加密算法 1.1 概述 对称加密算法是应用较早的加密算法,技术成熟。 在...

    本文主要介绍对称加密算法(symmetric encryption algorithm)和非对称加密算法(asymmetric cryptographic algorithm)的相关知识。

    1 对称加密算法

    1.1 概述

    对称加密算法是应用较早的加密算法,技术成熟。

    在对称加密算法中,数据发送方利用加密密钥、通过指定的加密算法将明文(原始数据)加密处理后,使明文加密为密文,然后发送出去。数据接收方在收到密文后,需要使用加密时使用的密钥、以及加密算法的逆算法对该密文进行解密,才能对应的明文。

    在对称加密算法中,消息发送方和接收方都使用同一个密钥对数据进行加密和解密,所以,使用对称加密时,要求解密方必须事先知道消息的加密密钥。

    1.2 示例及隐患

    对称加密的一方(比如小红)用密钥 K 给文本 M 加密,另一方(比如小明)用同一个密钥 K 解密。

    在此过程中,加解密的模型如下:

    小红:C = E(M, K)

    小明:M = D(C, K)

    根据对称加密原理,通信一方(如小明)必须要事先知道密钥 K,才能够对通信另一方(如小红)发送过来的消息进行解密,双方的加解密过程,如下图所示:

    不过,上图中存在这样一个问题:当一方(如小红)生成了密钥 K 之后,把 K 分享给另一方(小明)的过程中,有可能被人窃听到了密钥 K ,那么此时这个窃听者就可以假扮双方中的任何一方与另一方进行通信。这叫中间人攻击 mim(Man-in-the-middle_attack)。此过程如下图所示:

    2 非对称加密算法

    2.1 概述

    非对称加密算法需要两个密钥(密钥对),即公钥(public key)和私钥(private key)。公钥和私钥是成对出现的,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种加密算法叫作非对称加密算法。

    非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥,并将其中的一把作为公钥向其它方公开,得到该公钥的乙方使用该密钥(公钥)对机密信息进行加密后发送给甲方;甲方接收加密信息后,用自己保存的另一把专用密钥(私钥)对加密信息进行解密。

    说明:非对称加密算法的一般应用场景是“公钥加密、私钥解密”。

    2.2 示例及隐患

    现有用于非对称加密的密钥对:K1 和 K2。小红用其中一个密钥加密文本,小明可以用另一个密钥解密文本。比如,小红用 K1 加密,小明用 K2 解密。

    上述加解密过程的模型如下:

    小红:C = E(M, K1)

    小明:M = D(C, K2)

    根据上述模型,双方中的一方(比如小红)可以生成 K1 和 K2,然后把其中一个密钥(比如 K1)私藏,称为私钥;另一个密钥(比如 K2)公开,称为公钥。当另一方(比如小明)得到小红公开的公钥之后,双方就可以通信了。双方的加解密过程,如下图所示:

    不过,上图中依然存在一个问题:中间人 mim 还是可能截获小红公开的公钥 K2,然后自己弄一对密钥(K1, K2),然后欺骗小明说 K2 是小红的公钥,这样中间人 mim 每次都可以用截获的 K2 解密小红发给小明的文本(然后窃取甚至篡改文本),再用自己制造的 K1 加密了发给小明,小明收到消息后,用中间人 mim 制造的 K2 解密文本。此过程如下图所示:

    为了避免上述问题的出现,帮助小明确定得到的公钥确实是小红公开的公钥 K2(而不是中间人 mim 伪造的 K2),数字签名(digital signature)技术应运而生。

    关于数字签名技术的相关知识,请点击此处

    展开全文
  • 对称加密算法和非对称加密算法的区别 1.对称加密算法加密和解密使用的密钥的是相同的,也就是只有一个密钥,而非对称加密算法有两个密钥,也就是加密和解密所使用的密钥是不同的 2.各自算法不同 3.对称加密算法加密...

    对称加密算法和非对称加密算法的区别

    1.对称加密算法加密和解密使用的密钥的是相同的,也就是只有一个密钥,而非对称加密算法有两个密钥,也就是加密和解密所使用的密钥是不同的

    2.各自算法不同

    3.对称加密算法加密速度快(相对的),非对称算法,密钥成对生成,公钥对外发布,但是对大数据的加解密速度比对称算法慢。

    4.还有就是安全性不同,对称加密算法,在传输的过程中被窃听那就玩完了,而非对称加密算法就可以很好的避免这个问题

    5.数字签名,对称加密不可以用于数字签名和数字鉴别,非对称加密可以用于数字签名和数字鉴别。

    对称加密算法与非对称加密算法的相同点

    废话一句:都是加密算法

    咳咳…

    1.都是可逆的

    2.然后…

    然后…

    emm

    暂时没有想到

    对称加密算法和非对称加密算法的优缺点

    对称加密算法:速度快但是安全性不可保证、安全性取决于密钥的长度、对称加密算法是可逆的、占用的资源空间较少、源认证存在问题

    非对称加密算法:安全性高但是速度慢、非对称加密算法压缩可逆、占用运算空间资源较多、源认证存在问题

    常见的算法

    对称加密算法:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES等等

    非对称加密算法:RSA、Elgamal、背包算法、Rabin、D-H、ECC等等

    ps:

    ECC:椭圆曲线加密算法

    其他链接

    哔哩哔哩
    会同步该博客发一些自制视频

    微博
    用的比较少

    Github
    一些源代码

    知乎
    不懂的我一般会在上面提问

    简书
    同步该博客内容相同

    CSDN
    同步该博客内容相同
    博客首页

    个人联系方式

    QQ:2446264712

    微信:X15019749137

    邮箱:xiaoyangaichibaozi@yeah.net

    有意添加请备注 啊啊啊啊

    展开全文
  •  图1 用对称和非对称相结合的加密算法变换密钥的方法举例(首先产生一个 加密的动态对称密钥,然后用非对称加密算法在两个实体问进行变换, 产生和交换密钥对的非对称加密算法是事先单独进行的未在图中示出) ...
  • 第一 对称加密: 对称加密是指,加密...常用的对称加密算法:AES,RC4,3DES传输的示意图如下所示:如上图所示,此种方式属于对称加密,双方拥有相同的密钥,信息得到安全传输,但此种方式的缺点是:(1)不同的客户...
  • 什么是AES对称加密算法

    万次阅读 2018-03-19 22:10:59
    老师:了解一些,AES算法是典型的【对称加密算法】 小明:我不太明白,这个对称加密是什么鬼?它跟MD5,SHA这样的哈希摘要算法有什么不同? 老师:对称加密不同于信息摘要,是真正意义上的加密算法。我们来看看...
  • 主要介绍了Python3非对称加密算法RSA,结合实例形式分析了Python3 RSA加密相关模块安装及使用操作技巧,需要的朋友可以参考下
  • RSA非对称加密算法

    2019-02-14 23:12:03
    主要介绍RSA非对称加密算法的由来和应用场景,以及加密原理
  • 然而密码技术认为,「保密」信息总有一天会被扒出来,所以加密算法不应该依靠「保密」来保证机密性,而应该做到:即便知道了加密算法,依然无计可施。说的魔幻一点就是,告诉你我的密码,你依然不知道我的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,688
精华内容 31,875
关键字:

属于对称加密算法