精华内容
下载资源
问答
  • 对称加密算法例子
    2021-12-18 08:43:03

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

    ​ 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。常见的非对称加密算法:RSA、DSA、ECC等。

    下面例子演示了RSA算法生成公私钥对公钥加密私钥解密的过程:

    public class RSAEncrypt {
    
        final static Base64.Decoder decoder = Base64.getDecoder();
        final static Base64.Encoder encoder = Base64.getEncoder();
    
        /**
         * RSA公钥加密
         * @param str 加密字符串
         * @param publicKey 公钥
         * @return 密文
         * @throws Exception  加密过程中的异常信息
         */
        public static String encrypt( String str, String publicKey ) throws Exception{
            //base64编码的公钥
            byte[] decoded = decoder.decode(publicKey);
            RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA")
                    .generatePublic(new X509EncodedKeySpec(decoded));
            //RSA加密
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, pubKey);
            String outStr = encoder.encodeToString(cipher.doFinal(str
                    .getBytes("UTF-8")));
            return outStr;
        }
    
        /**
         * RSA私钥解密
         * @param str 加密字符串
         * @param privateKey 私钥
         * @return 明文
         * @throws Exception 解密过程中的异常信息
         */
        public static String decrypt(String str, String privateKey) throws Exception{
            //base64解码后的字符串
            byte[] inputByte =  decoder.decode(str.getBytes("UTF-8"));
            //base64编码的私钥
            byte[] decoded =  decoder.decode(privateKey);
            RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA")
                    .generatePrivate(new PKCS8EncodedKeySpec(decoded));
            //RSA解密
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, priKey);
            String outStr = new String(cipher.doFinal(inputByte));
            return outStr;
        }
    
        //生成密钥对
        public static KeyPair getKeyPair() throws Exception {
            KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
            //可以理解为:加密后的密文长度,实际原文要小些 越大 加密解密越慢
            keyGen.initialize(512);
            KeyPair keyPair = keyGen.generateKeyPair();
            return keyPair;
        }
    
        public static Map<Integer, String>  genKeyPair() throws Exception {
            Map<Integer, String> keyMap = new HashMap<Integer, String>();
            //生成公私钥对
            KeyPair keyPair = getKeyPair();
            PublicKey publicKey =  keyPair.getPublic();
            PrivateKey privateKey = keyPair.getPrivate();
    
            String publicKeyString = encoder.encodeToString(publicKey.getEncoded());
            // 得到私钥字符串
            String privateKeyString = encoder.encodeToString(privateKey.getEncoded());
            // 将公钥和私钥保存到Map
            keyMap.put(0,publicKeyString);  //0表示公钥
            keyMap.put(1,privateKeyString);  //1表示私钥
            return keyMap;
        }
    }
    
     /**
     * 测试RSA加解密
     */
    @Test
    public void test1() throws Exception {
        Map<Integer, String> keyMap = RSAEncrypt.genKeyPair();
        String content = "你好世界";
        System.out.println("随机生成的公钥为:" + keyMap.get(0));
        System.out.println("随机生成的私钥为:" + keyMap.get(1));
        String messageEn = RSAEncrypt.encrypt(content,keyMap.get(0));
        System.out.println("加密后的字符串为:" + messageEn);
        String messageDe = RSAEncrypt.decrypt(messageEn,keyMap.get(1));
        System.out.println("解密后的字符串为:" + messageDe);
    
    }

    更多相关内容
  • c# 对称加密算法 例子

    2008-10-24 14:28:26
    c# 对称加密算法 例子~~~~~~~~~~~~~~ http://www.dotnetdev.cn
  • RSA加密算法-Java实现,随机生产秘钥对,由公钥对内容进行加密,私钥解密。
  • AES对称加密算法

    千次阅读 2021-07-07 16:13:53
    AES(Advanced Encryption Standard)是一种对称加密算法(也叫共享密钥),对称加密算法的意思是加密和解密都是用同一个密钥(密钥和秘钥是同义词),它用来代替DES(Data Encryption Standard,56位密钥)。...

    AES加密算法

    AES(Advanced Encryption Standard)是一种对称加密算法(也叫共享密钥),对称加密算法的意思是加密和解密都是用同一个密钥(密钥和秘钥是同义词),通常来说,对称加密算法效率要优于非对称加密算法,它用来代替DES(Data Encryption Standard,56位密钥)。AES有三个关键点:密钥、填充、模式。

    • 密钥
      • 密钥分为128位(16字节)、192位(24字节)、256位(32字节),位数越多,解密和加密的运算量越大,相应的越安全,可以折中使用192位兼顾效率和安全。
    • 填充
      • 填充,在加密时,会将数据按照128位(16字节)一组分为多个明文块,然后对明文块分别加密;当然了,加密时与解密时的填充必须一致,否则无法解密。
      • NoPadding
        • 不填充,但要求明文必须是128位的整数倍;如果使用NoPadding,程序要对明文预处理进行填充,以达到16字节整数倍的要求。
      • PKCS5Padding(默认)
        • 如果明文块少于128位,则补足相应数量的字符,且字符的值等于缺少的字节数。比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则补全为{1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}
      • ISO10126Padding
        • 如果明文块少于16字节,则补足相应数量的字符,且最后一个字符的值等于缺少的字节数,其他字符填充随机数;比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则可能补全为{1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}
    • 模式
      • 模式,上边提到过,加密时,会将数据分为一组一组的明文。
      • ECB
        • ECB(电码本模式 Electronic Codebook Book 默认)是各组分别加密然后拼接起来,各组之间没有关系,可以并行计算;
      • CBC
        • CBC(密码分组链接模式 Cipher Block Chaining,默认),第二组依赖第一组的结果,第三组依赖第二组的结果,只有等待前一个组加密完成后,再进行下一组加密,以此类推,这种就没法并行计算。与ECB不同的事,CBC有初始向量,初始向量先于明文进行运算,结果再与密钥进行运算。

    注意,咱们通常所说的“密钥”并不是真正的密钥,而是产生密钥的“种子”。

    举例

    好了,我们用java实验一下AES算法,AES算法在javax.crypto包下

    ECB模式

    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    String key = "aaaaaaaaaaaaaaaa";
     SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8),"AES");
     cipher.init(Cipher.ENCRYPT_MODE,secretKeySpec);
     String content = "你好";
     byte[] encryptBytes = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
    
     cipher.init(Cipher.DECRYPT_MODE,secretKeySpec);
     byte[] plaintextBytes = cipher.doFinal(encryptBytes);
     String plaintext = new String(plaintextBytes, StandardCharsets.UTF_8);
     log.info("解密后:{}",plaintext);
    

    CBC模式

    CBC模式必须使用初始向量

    String seed = "aaaaaaaaaaaaaaaa";
    //CBC有偏移量
    IvParameterSpec ivspec = new IvParameterSpec(seed.getBytes(StandardCharsets.UTF_8));
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    SecretKeySpec secretKeySpec = new SecretKeySpec(seed.getBytes(StandardCharsets.UTF_8),"AES");
    cipher.init(Cipher.ENCRYPT_MODE,secretKeySpec,ivspec);
    String content = "你";
    byte[] encryptBytes = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
    byte[] encryptedBase64 = Base64.getEncoder().encode(encryptBytes);
    log.info("加密后:{}",new String(encryptedBase64, StandardCharsets.UTF_8));
    byte[] decode = Base64.getDecoder().decode(encryptedBase64);
    
    cipher.init(Cipher.DECRYPT_MODE,secretKeySpec,ivspec);
    byte[] plaintextBytes = cipher.doFinal(decode);
    String plaintext = new String(plaintextBytes, StandardCharsets.UTF_8);
    log.info("解密后:{}",plaintext);
    

    不填充

    以上两个例子都使用了填充,如果使用不填充,那么就需要对明文预处理,确保明文是16字节的整数倍,通常做法是将明文转换为字节数组,将字节数组补为16的倍数,补齐的值都是0,0在ASCII中对应的是没有字符,所以在解码时也不需要特殊处理。比如

     Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
            int blockSize = cipher.getBlockSize();
            byte[] dataBytes;
    		try {
    			dataBytes = data.getBytes("UTF-8");
    		} catch (UnsupportedEncodingException e) {
    			throw new RuntimeException(e);
    		}
            int plaintextLength = dataBytes.length;
            //数据长度必须是16的倍数
            if (plaintextLength % blockSize != 0) {
                plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
            }
            byte[] plaintext = new byte[plaintextLength];
            //字节数组补齐为16的倍数,补上的位置都是0,0在ASCII中不对应字符,所以在解码时不需要特殊处理;
            System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
    

    在这里插入图片描述

    常见错误

    java.security.InvalidKeyException: Illegal key size or default parameters

    默认的jdk提供的AES算法只支持128位,如果超过128位就会抛出这个异常。
    根据Stack Overflow所说,JDK8 Update 161版本开始,不限制长度,如果遇到这个问题,就升级JDK吧。

    参考

    程序员小灰讲AES

    展开全文
  • 对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。常用的对称加密算法:AES,RC4,3DES传输的示意图如下所示:如上图所示,此种...
    第一 对称加密:
    对称加密是指,加密方和解密方使用同样的秘钥来进行加密和解密。
    在对称加密算法中,数据发信方将明文( 原始数据 )和加密 密钥 (mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。常用的 对称加密算法:AES,RC4,3DES

    传输的示意图如下所示:

    如上图所示,此种方式属于对称加密,双方拥有相同的密钥,信息得到安全传输,但此种方式的缺点是:

    (1)不同的客户端、服务器数量庞大,所以双方都需要维护大量的密钥,维护成本很高

    (2)因每个客户端、服务器的安全级别不同,密钥极易泄露

    这里举例一个使用DES算法来实现对称加密的例子:

    public class DESUtils {

    public byte[] initKey(){
    try {
    KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
    keyGenerator.init(56);
    SecretKey secretKey = keyGenerator.generateKey();
    return  secretKey.getEncoded();
    } catch (NoSuchAlgorithmException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    return null;
    }

    /**
      * @Method: encrypt
      * @Description: 加密算法
      * @param data 被加密字节数组
      * @param key  随机对称密钥
      * @return
      * 返回类型:byte[]
      */
    public byte[] encrypt(byte[] data,byte[] key){
    SecretKey secretKey = new SecretKeySpec(key, "DES");
    Cipher cipher;
    try {
    cipher = Cipher.getInstance("DES");
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    return cipher.doFinal(data);
    } catch (Exception e) {
    e.printStackTrace();


    return null;
    }

    /**
      * @Method: decode
      * @Description: TODO
      * @param 被解密的字节数组
      * @param key 随机对称密钥(和加密密钥务必保持一致)
      * @return
      * 返回类型:byte[]
      */
    public byte[] decode(byte[] data,byte[] key){
    SecretKey secretKey = new SecretKeySpec(key, "DES");
    Cipher cipher;
    try {
    cipher = Cipher.getInstance("DES");
    cipher.init(Cipher.DECRYPT_MODE, secretKey);
    return cipher.doFinal(data);
    } catch (Exception e) {
    e.printStackTrace();


    return null;
    }

    测试代码为:

    public static void testDes(){
    DESUtils desUtils = new DESUtils();
    byte[] key = desUtils.initKey();   // 
    String originData = "123456";
    System.out.println("原始数据:"+originData);
    try {
    // 将原始数据转化为字符串
    byte[] arrayOrigin = originData.getBytes("utf-8");
    // 对原始数据进行加密
    byte[] encryption = desUtils.encrypt(arrayOrigin, key);
    // 通过BASE64Encoder转化处理
    String encryptionStr = new BASE64Encoder().encode(encryption);
    System.out.println("经过加密之后的字符串:"+encryptionStr);

    try {
    // 使用BASE64Decoder进行转化处理
    byte[] decoceOrigin = new BASE64Decoder().decodeBuffer(encryptionStr);
    // 使用DES进行解密操作
    byte[] decode = desUtils.decode(decoceOrigin, key);
    // 把字节数组转化为字符串
    String decodeStr = new String(decode,"utf-8");
    System.out.println("对加密字符串进行解密:"+decodeStr);
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }

    运行结果如下:

    原始数据:123456
    经过加密之后的字符串:jaKOVkHJtOQ=
    对加密字符串进行解密:123456

    第二 、非对称加密:
    非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。 非对称加密算法:RSA,DSA/DSS 

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

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

    实现非对称加密算法例子:

    public class AsymmetricEncryption {


    public static final String KEY_ALGORITHM = "RSA";
    /** 貌似默认是RSA/NONE/PKCS1Padding,未验证 */
    public static final String CIPHER_ALGORITHM = "RSA/ECB/PKCS1Padding";
    public static final String PUBLIC_KEY = "publicKey";
    public static final String PRIVATE_KEY = "privateKey";


    /** RSA密钥长度必须是64的倍数,在512~65536之间。默认是1024 */
    public static final int KEY_SIZE = 2048;


    public static final String PLAIN_TEXT = "hello world!";


    /**
    * @Method: generateKeyBytes
    * @Description: 首先产生一个公钥和私钥对,使用HashMap保存起来
    * @return 返回类型:Map<String,byte[]>
    */
    public static Map<String, byte[]> generateKeyBytes() {


    try {
    KeyPairGenerator keyPairGenerator = KeyPairGenerator
    .getInstance(KEY_ALGORITHM);
    keyPairGenerator.initialize(KEY_SIZE);
    KeyPair keyPair = keyPairGenerator.generateKeyPair();


    RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
    RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();


    Map<String, byte[]> keyMap = new HashMap<String, byte[]>();
    keyMap.put(PUBLIC_KEY, publicKey.getEncoded());
    keyMap.put(PRIVATE_KEY, privateKey.getEncoded());
    return keyMap;
    } catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
    }
    return null;
    }


    /**
    * 还原公钥,X509EncodedKeySpec 用于构建公钥的规范

    * @param keyBytes
    * @return
    */
    public static PublicKey restorePublicKey(byte[] keyBytes) {
    X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);


    try {
    KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);
    PublicKey publicKey = factory.generatePublic(x509EncodedKeySpec);
    return publicKey;
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }


    /**
    * 还原私钥,PKCS8EncodedKeySpec 用于构建私钥的规范

    * @param keyBytes
    * @return
    */
    public static PrivateKey restorePrivateKey(byte[] keyBytes) {
    PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(
    keyBytes);
    try {
    KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);
    PrivateKey privateKey = factory
    .generatePrivate(pkcs8EncodedKeySpec);
    return privateKey;
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }


    /**
    * 加密,三步走。

    * @param key
    * @param plainText
    * @return
    */
    public static byte[] RSAEncode(PublicKey key, byte[] plainText) {


    try {
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
    cipher.init(Cipher.ENCRYPT_MODE, key);
    return cipher.doFinal(plainText);
    } catch (Exception e) {
    e.printStackTrace();
    }


    return null;
    }


    public static String RSADecode(PrivateKey key, byte[] encodedText) {


    try {
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
    cipher.init(Cipher.DECRYPT_MODE, key);
    return new String(cipher.doFinal(encodedText));
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }

    }

    测试代码如下:

    public static void tesRSA(){
    Map<String, byte[]> keyMap = AsymmetricEncryption.generateKeyBytes();

    // 加密
    PublicKey publicKey = AsymmetricEncryption.restorePublicKey(keyMap.get(AsymmetricEncryption.PUBLIC_KEY));
    byte[] encodedText = AsymmetricEncryption.RSAEncode(publicKey, AsymmetricEncryption.PLAIN_TEXT.getBytes());
    String rsaString = new BASE64Encoder().encode(encodedText);
    System.out.println("RSA encoded: " + rsaString);

    PrivateKey privateKey = AsymmetricEncryption.restorePrivateKey(keyMap.get(AsymmetricEncryption.PRIVATE_KEY));
    System.out.println("RSA decoded: "+ AsymmetricEncryption.RSADecode(privateKey, encodedText));

    }

    运行结果如下所示:

    RSA encoded: e7wIyV32VtiJhiraQGIYxD2TKtC4O6dRJx0lgVuEUsjCTSjqNFmEVNlYmFzd3ohIiW67XyIfEzWD
    W9YFpFnDekRFLgeerh7c5gXMLVsVkf7k7XuTbiGmQOlOBUmL8VWpWVWTk8Rgn7Y+G7/dz9+DOEnH
    csMnssKC/MBM80Ad5Za+QHqgb6BdZNHjZYzWpDIztBEUf/yHWfkGhmJahxo6Ff6y8er/shiP+qL3
    hMJlw70TTGoGlrAWQqxUMYGPrv4IELi/iNSednXxo5bNNatJYke7FhKnuy8GEOWNH/K8Q52vl24L
    cururJGLEJR6Hn/oaGxnXQbs2Fzo3vUziDj1cQ==
    RSA decoded: hello world!

    第三 非对称和对称完美结合

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


    如上图所示

    (1)第 ③ 步时,客户端说:(咱们后续回话采用对称加密吧,这是对称加密的算法和对称密钥)这段话用公钥进行加密,然后传给服务器

    (2)服务器收到信息后,用私钥解密,提取出对称加密算法和对称密钥后,服务器说:(好的)对称密钥加密

    (3)后续两者之间信息的传输就可以使用对称加密的方式了

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



    展开全文
  • 密码学专题 对称加密算法

    千次阅读 2021-11-16 18:02:06
    一般来说,使用OpenSSL对称加密算法有两种方式,一种是使用API函数的方式,一种是使用OpenSSL提供的对称加密算法指令方式。本书将介绍对称加密算法的指令方式 OpenSSL的对称加密算法指令主要用来对数据进行加密和...
    • 一般来说,使用OpenSSL对称加密算法有两种方式,一种是使用API函数的方式,一种是使用OpenSSL提供的对称加密算法指令方式。本书将介绍对称加密算法的指令方式
    • OpenSSL的对称加密算法指令主要用来对数据进行加密和解密处理输入输出的方式主要是文件,当然,也可以是默认的标准输入输出设备
    • OpenSSL基本上为所有其支持的对称加密算法都提供了指令方式的应用,这些应用指令的名字基本上都是以对称加密算法本身的名字加上位数、加密模式或其他属性组合而成。比如DES算法的CBC模式,其对应的指令就是des-cbc。
    • 要查找最新版本的OpenSSL支持哪些对称加密算法指令,只要在OpenSSL应用程序提示符下输入“-help”,就可以看到在输出信息最后部分(Ciphercommands)有很多我们熟悉的算法名称,这些就是OpenSSL支持的对称加密算法指令。OpenSSL还将所有的对称加密算法指令集成在一个指令程序中,那就是enc指令
    • enc指令是OpenSSL中对称加密算法指令的集大成者,用户可以在它的一个参数中指定使用哪种加密算法和模式,从而统一了对称加密算法指令的入口。enc指令的格式跟单独一个对称加密算法指令的格式是基本一样的,但是增加了一个算法类型的选择参数选项。
    • 比如,下面两种形式的指令是等价的:

    • OpenSSL的对称加密算法指令还可以增加BASE64编解码的功能,也就是说,可以在数据加密后将数据进行BASE64编码后输出保存,然后在解密的时候先将数据进行BASE64解码后再进行解密。这样,对于加密后数据的保存和处理就更加方便,因为BASE64编码将加密后的很多不可见字符都编码成可见的字符了。当然,如果你愿意,也可以单独使用BASE64编码的功能,OpenSSL为此也提供了专门的指令,其使用形式跟其他对称加密算法指令是一致的。
    • OpenSSL的对称加密算法指令还可以作为使用第三方加密库(通常是硬件加密设备)的应用接口,也就是说,它可以使用第三方的加密库作为完成加密操作的真正设备。这是通过OpenSSL的Engine机制实现的。当然,使用第三方加密库的前提是你已经安装了第三方的加密设备并成功通过Engine机制加载到了OpenSSL中。 
    • 不过,对OpenSSL的所有指令,包括对称加密算法指令,你不能期望过高,这些指令虽然功能强大,但是并没有支持所有可能的加密算法和模式,只是提供了固定的部分功能。比如对称加密算法指令就不支持76位的RC2加解密或者84位的RC4加解密等功能。如果你想使用这些灵活的加密模式和算法,那么就需要对OpenSSL进行进一步的深入研究,即使用OpenSSL的API。

     

    • 对于大部分块加密对称加密算法,OpenSSL都提供了CBC、CFB、ECB和OFB四种加密模式。需要注意的是,对于使用两个密钥和三个密钥EDE方式的三重DES算法,其ECB模式的指令名称并没有明确标出,很容易跟CBC模式混同,因为块加密算法使用最多的是CBC方式。 
    • 如果要单独使用BASE64编码而不进行数据的加密和解密,那么只要简单地忽略算法类型参数并加上“a”或者“base64”选项就可以了,当然,你如果不愿意忽略算法类型,也可以输入“-none”选项。下面三种形式是等价的,仅使用BASE64编码的指令:

    • 从表还可以看出,对于绝大部分对称加密算法来说,都有enc参数式的指令和单独的指令两种方式,它们都是等价的,至于选择哪一种,主要取决于用户本身的偏好。不过,enc指令可能会更快地支持新的对称加密算法,而单独的对称加密算法指令就不一定能得到及时的更新。这跟enc实现的机制是有关系的,因为enc使用的是OpenSSL内部定义的对称加密算法简称作为类型输入参数,只要是OpenSSL定义的对称加密算法模式,enc程序都能通过接口API自动支持,不需要因为增加了新的对称加密算法而进行enc应用程序的修改。 
    • 相对于其他指令来说,对称加密算法的指令参数比较少,使用起来也相对容易。对称 加密算法指令的参数形式如下:

    • iphername是在表7-1中第二列和第三列中出现的参数值之一。如果你选择第一种指令形式,那么就需要选择表7-1第二列的参数形式;如果你选择的是后一种独立对称加密算法指令方式,那就应该使用表7-1第三列的参数形式。对于第一种对称加密算法指令使用方式来说,如果你不需要进行任何加密或解密处理,那么可以输入none选项替代ciphername,当然,你也可以简单忽略ciphername选项,其效果是一样的。

    (2)in和out选项

    • 这两个选项分别用于指令输入和输出文件,对于加密操作来说,输入的应该是明文文件,也就是要加密的文件,输出的是密文文件,即经过加密的文件;对于解密操作来说,输入的是经过加密的文件,而输出的是恢复的明文文件。输入和输出文件名本身是没有任何限制的,只要符合习惯的文件名形式即可。需要注意的是,一般不要试图编辑和改变加密后的文件,那样做可能引起文件的部分甚至全部内容不能进行正确的解密!默认的输入和输出文件是标准输入和输出设备,对于Windows来说,就是指令行界面。需要注意的是,如果提供的输出文件名是已经存在的文件,那么程序会首先将该文件内容清空!

    (3)口令输入选项pass,k和kfile

    • 如果你不愿意输入繁杂的用来加密数据的密钥和初始向量,那么可以使用从口令中提取密钥和初始向量的方法。OpenSSL对称加密算法指令中输入口令的目的正在于此,事实上,OpenSSL中几乎所有输入的口令都是用作提取密钥的材料,而不是直接用作加密的密钥。pass选项提供了最灵活的口令输入方式,输入的源可以是标准输入设备、指令行直接输入、提示输入、文件、环境变量和文件描述符,具体的格式介绍读者可以参考7-4节的应用实例。k选项和kfile选项都是为了兼容以前的版本而保留的,它们的功能目前都可以使用pass选项来实现。k选项后面输入的参数是口令字符。kfile选项后面输入的参数是作为口令的文件名,当然,必要的时候应该也提供路径。OpenSSL的口令文件以第一行作为输入口令。

    (4)e和d选项

    • e和d选项分别表示执行加密操作(encryption)和解密操作(decryption),两个参数是互斥的,不能同时出现,但是可以同时不出现,这时候就执行默认的操作,即执行加密操作。这两个选项都不带参数。

    (5)base64,a和A选项

    • 选项a和base64的作用是相同的,就是将文件进行BASE64的编解码操作。对于加密操作来说,就在数据加密之后进行BASE64编码;对于解密操作来说,就在解密操作之前执行BASE64解码。A选项跟a或者base64选项一起使用才能生效,如果出示了A选项,则程序将努力将所有加密数据作为一行进行BASE64编码,而不是按照文件原有的换行格式进行BASE64编码。需要注意的是,在文件比较大的时候,A选项经常会导致指令执行失败。上述三个选项都不带参数。

    (6)K和IV选项

    • 如果你使用这两个选项,意味着你不相信OpenSSL从口令提取加密密钥和初始向量的方法,而使用自己直接提供的加密密钥和初始向量,那么这时候你就不再需要使用口令选项。K选项后面的参数是加密密钥,是以十六进制的方式表示,长度不能超过64个字符。IV选项只有在分组加密算法的某些模式才需要,其参数也是以十六进制的方式表示,长度不能超过32个字符。如果输入的参数不是十六进制的字符,那么程序就会报错。上述选项参数输入的长度如果不够,就在后面补零替代。

    (7)salt,nosalt和S选项

    • salt选项指明在从口令提取密钥的过程中使用盐值,这可以增强被加密数据的安全性,事实上,即便不出示此选项,默认指令也会使该选项生效。nosalt选项跟salt选项相反,告诉指令在密钥提取的过程中不使用盐值,一般来说,如果不是特别地为了跟OpenSSL一些老版本兼容,不要做这样降低安全性的事情。S选项后面的输入参数是十六进制编码的真正使用的盐值,其长度不能超过16个字符。所有这些选项只有跟口令输入选项一起使用才会生效,如果你使用K和IV选项方式输入加入密钥,那么这些选项将不会产生任何作用。

    (8)engine选项

    • 该选项的参数是OpenSSL支持的Engine的名称,一般是以字符串表示,比如“cswift”,“nuron”和“pkcs11”等。如果你不知道目前你的OpenSSL支持的Engine特征字符串,可以输入下列指令,其中有效的Engine都会提示出来:
    • OpenSSL>engine -t
    • 如果你使用了有效的Engine,那么你所执行的加密操作实际上都是在第三方加密设备中执行,而不再是使用OpenSSL密码库的软件算法。

    (9)p和P选项

    • p选项打印出对称加密算法真正使用的加密密钥和初始向量,输出的格式是十六进制的形式。如果出示了P选项,则程序在打印出加密密钥和初始向量后就立刻退出,而不执行真正的加密或解密操作。

    (10)nopad,bufsize和debug选项

    • 这几个选项之间其实并没有联系,这里之所以放在一起,只是为了节省篇幅。nopad选项指定不使用默认的PKCS#5标准的补丁方式,如果这样做,那么就要确保在块加密算法中输入的数据是加密块长度的整数倍,比如使用DES算法,就要保证输入的数据是8字节的整数倍。
    • bufsize选项的参数指定了读写文件的I/O缓存,指定的数字以字节为单位,也可以在数字后面加“k”表示是以1024字节为单位。比如,下面的格式都是可以被接受的:
    • -bufsize 256 或者 -bufsize 8k
    • 如果你指定的缓存小于80字节,指令程序会自动将它增加为80字节,这是进行BASE64一行编码所需要的最小长度。
    • 使用debug选项后,OpenSSL的对称加密算法指令会将整个执行过程中I/O操作相关的BIO列出来。这主要是为了调试目的而使用,对于一般用户来说,该选项很少使用。

    例子

    • 本节将给出对称加密算法指令的一些具体实例,在下面的例子中,“pln.txt”表示明文文件,“enc.txt”表示经过加密的密文文件,而“rcv.txt”表示恢复的明文文件。
    • 下面指令将文件pln.txt的内容复制到文件enc.txt中:

    • 使用的时候 需要指定文件的绝对路径 

    •  OpenSSL对称加密算法加密数据的时候需要使用密钥,对于块加密算法的某些模式,还需要初始向量,既可以直接输入加密密钥和初始向量,也可以通过口令来提取加密密钥和初始向量
    • 就口令输入来说,也有多种不同的方式,本节将给出多种输入口令和密钥的例子。
    • 下面是DES算法CBC模式指令直接使用加密密钥和初始向量的例子:

    展开全文
  • 面试官:说一说你常用的加密算法有哪些?
  • 面试官:说一说你常用的加密算法有哪些?
  • 对称加密及案例

    2021-11-01 16:06:21
    对称加密算法在加密时使用的是同一个密钥,为了解决信息公开传送和密钥管理的问题,于是提出了一种新的密钥交换协议,这种协议允许在不安全的媒体上的通讯双方交换信息、安全地达成一致的密钥,这就是非对称加密...
  • 引用360百科解释引用360百科解释看完以上概念,应该对这四中分类有一定的了解,那么实际上呢,四种分类评判的维度不完全一致,而细心的小伙伴则会发现,实际上可逆加密是包含非对称加密对称加密的,为什么这样说呢...
  • 然而密码技术认为,「保密」信息总有一天会被扒出来,所以加密算法不应该依靠「保密」来保证机密性,而应该做到:即便知道了加密算法,依然无计可施。说的魔幻一点就是,告诉你我的密码,你依然不知道我的...
  • 常见对称加密算法

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

    万次阅读 2018-03-16 21:44:45
    对称加密算法 非对称加密算法是一种密钥的保密方法。非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有...
  • 对称加密算法-DES

    2019-12-07 15:55:05
    对称加密算法的特点是算法公开,计算量小,加密速度快,加密效率高,优势在于加解密的高速度和长密钥时的难破解性,但是,对称加密算法的安全性依赖于密钥,泄露密钥就意味着任何人都可以对加密的密文进行破解。...
  • 常见加密算法及其例子(base64,md5等)

    千次阅读 2020-03-15 10:21:53
    文章目录单向散列哈希算法md5DigestUtils(spring)实现md5对称加密算法base64BASE64(jdk自带)实现base64非对称加密算法(又称:公开密钥加密算法)对称加密和非对称加密的结合 单向散列哈希算法 MD5、SHA(128、256)...
  • 1.对称加密中,谁加密的谁解密。 2.非对称加密中, 公钥加密的数据只有私钥可以解密, 私钥加密的数据只有公钥可以解密。 1.客户端给服务端发送自己所支持的算法种类,服务端选择一种以证书的形式返回给客户端。 ...
  • 常见非对称加密算法

    万次阅读 2019-04-10 15:14:35
    对称加密技术只使用一个秘钥不同,非对称机密技术使用两个秘钥进行加解密,一个叫做公钥,一个叫做私钥,私钥自己来保管,公钥可以公开,使用公钥加密的数据必须使用私钥解密,反之亦然公钥和私钥是两个不同的秘钥...
  •    之前的章节讲到了对称加密算法AES,发送方和接收方需要使用相同的密钥进行通讯,但是发送方怎么将密钥安全的发送给接收方?这是一个问题。   对称加密算法中,为了将密钥安全的发送给对端,通常有以下四种...
  • 常见的加密算法可以分成三类,对称加密算法、非对称加密算法、Hash算法。 一、对称加密算法 对称加密是使用同一个密钥对信息进行加解密。 这就类似于,我们对一个压缩包进行加密时输入一个密码,那么我们在解密时...
  • 1.RSA非对称加密 (1)选择两个素数p和q ,计算n=p*q和欧拉函数φ(n)=(p-1)(q-1),选择整数e,使gcd(φ(n), e)=1(即φ(n)和e是互素),1<e<φ(n); (2)计算e的逆元d=e-1mod φ(n)(即ed = 1 mod φ(n)); (3)...
  • RSA非对称加密算法详解

    万次阅读 多人点赞 2019-01-28 17:11:57
    RSA加密算法是最常用的非对称加密算法,由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)于1977年一起提出,RSA就是他们三人姓氏开头字母拼在一起组成的。非对称...
  • 对称加密算法——RSA算法原理及C++实现

    万次阅读 多人点赞 2021-03-18 09:23:20
    什么是非对称加密算法三. 双方交换信息工作流程四.密钥生成数学原理五.总结公钥和私钥生成步骤六.解决大数运算1.getCountAdd() 解决大数相加2. getCountExp() 解决大数幂运算3. getCountmod() 解决大数求余七.举个...
  • 加解密篇 - 非对称加密算法 (RSA、DSA、ECC、DH)

    万次阅读 多人点赞 2019-01-30 20:07:23
    最近的文章中多次出现了非对称加密,今天就来分析一下非对称加密算法。   目录: 简介 RSA算法 DSA算法 ECC算法 DH算法     1. 简介   1.1 概念 非对称加密需要两个密钥:公钥 (publickey) 和...
  • 对称加密算法 1.对称加密算法的介绍 对称加密是最快速、最简洁的一种加密方式,加密与解密用的是同样的秘钥。 2.加密环境的3种解决方案 1.设置秘钥key 在配置文件中添加: encrypt.key=me 2.配置jce 下载...
  • 用C#实现的数据加密(一) —— 对称加密算法 以下是关于对称加密算法的C#实现代码,大家可以根据需要更改不同的算法,文中以Rijndael算法为例: using System; using System.IO; using System.Security....
  • 哈希算法和非对称加密算法的理解

    千次阅读 2020-02-19 18:46:05
    加密货币到区块链;从比特币到钱包……今天我们再学点新知识。 1、哈希算法是什么? 哈希算法又叫散列算法,是将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。它的原理其实...
  • 一文详解 RSA 非对称加密算法

    千次阅读 多人点赞 2018-10-17 17:49:28
    对称加密算法指的是 加、解密使用不同的密钥,一把为公开的公钥,另一把为私钥。 公钥加密的内容只能由私钥进行解密,反之由私钥加密的内容只能由公钥进行解密。也就是说,这一对公钥、私钥都可以用来加密和解密,...
  • 常见加密算法 : DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合;  3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高; RC2和 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,698
精华内容 7,879
热门标签
关键字:

对称加密算法例子