互联网并发与安全系列教程(13) - 信息加密技术(对称&非对称加密)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 互联网并发与安全系列教程(13) - 信息加密技术(对称&非对称加密)

1. 对称加密

对称密码技术发件人和收件人使用其共同拥有的单个密钥 ,这种密钥既用于加密,也用于解密,叫做机密密钥(也称为对称密钥或会话密钥)。

能够提供信息机密性(没有密钥信息不能被解密)、完整性(被改变的信息不能被解密)的服务。

对称式密码学又称:单钥密码学、秘密密钥密码学、会话密钥密码学、私钥密码学、共享秘钥密码学。

1.1 常见的对称式加密技术
  • DES(数据加密标准):分组式加密,算法源于Lucifer,作为NIST对称式加密标准;64位(有效位56位、校验8位),分组算法
  • 3DES:128位,分组算法
  • IDEA(国际数据加密算法):128位,比DES快,分组算法
  • Blowfish:32-448位,算法公开,分组算法
  • RC4:流密码,密钥长度可变
  • RC5:分组密码,密钥长度可变,最大2048位
  • Rijndael:128位/196位/256位
  • AES(高级加密标准):DES升级版,算法出自Rinjindael
1.2 对称密码的优点
  • 用户只需记忆一个密钥,就可用于加密、解密;
  • 与非对称加密方法相比,加密解密的计算量小,速度快,简单易用,适合于对海量数据进行加密处理 。
1.3 对称密码的缺点
  • 如果密钥交换不安全,密钥的安全性就会丧失。特别是在电子商务环境下,当客户是未知的、不可信的实体时,如何使客户安全地获得密钥就成为一大难题。
  • 如果用户较多情况下的密钥管理问题 N*(N-1)/2
  • 如果密钥多个用户被共享,不能提供抗抵赖性
1.4 对称密码案例

假设Alice和Bob是认识的,两人为了保证通信消息不被其它人截取,预先约定了一个密码,用来加密在他们之间传送的消息,这样即使有人截取了消息没有密码也无法知道消息的内容。由此便实现了机密性。

1.5 基于DES实现加密和解密

DES加密工具类:

/**
 * DES加密介绍 DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。DES加密算法出自IBM的研究,
 * 后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥,以现代计算能力, 24小时内即可被破解。虽然如此,在某些简单应用中,我们还是可以使用DES加密算法,本文简单讲解DES的JAVA实现 。
 * 注意:DES加密和解密过程中,密钥长度都必须是8的倍数
 */
public class DES {
  public DES() {
  }
  // 测试
  public static void main(String args[]) {
    // 待加密内容
    String str = "cryptology";
    // 密码,长度要是8的倍数
    String password = "95880288";
    byte[] result = DES.encrypt(str.getBytes(), password);
    System.out.println("加密后:" + new String(result));
    // 直接将如上内容解密
    try {
      byte[] decryResult = DES.decrypt(result, password);
      System.out.println("解密后:" + new String(decryResult));
    } catch (Exception e1) {
      e1.printStackTrace();
    }
  }
  /**
   * 加密
   * 
   * @param datasource
   *            byte[]
   * @param password
   *            String
   * @return byte[]
   */
  public static byte[] encrypt(byte[] datasource, String password) {
    try {
      SecureRandom random = new SecureRandom();
      DESKeySpec desKey = new DESKeySpec(password.getBytes());
      // 创建一个密匙工厂,然后用它把DESKeySpec转换成
      SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
      SecretKey securekey = keyFactory.generateSecret(desKey);
      // Cipher对象实际完成加密操作
      Cipher cipher = Cipher.getInstance("DES");
      // 用密匙初始化Cipher对象,ENCRYPT_MODE用于将 Cipher 初始化为加密模式的常量
      cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
      // 现在,获取数据并加密
      // 正式执行加密操作
      return cipher.doFinal(datasource); // 按单部分操作加密或解密数据,或者结束一个多部分操作
    } catch (Throwable e) {
      e.printStackTrace();
    }
    return null;
  }
  /**
   * 解密
   * 
   * @param src
   *            byte[]
   * @param password
   *            String
   * @return byte[]
   * @throws Exception
   */
  public static byte[] decrypt(byte[] src, String password) throws Exception {
    // DES算法要求有一个可信任的随机数源
    SecureRandom random = new SecureRandom();
    // 创建一个DESKeySpec对象
    DESKeySpec desKey = new DESKeySpec(password.getBytes());
    // 创建一个密匙工厂
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// 返回实现指定转换的
                                      // Cipher
                                      // 对象
    // 将DESKeySpec对象转换成SecretKey对象
    SecretKey securekey = keyFactory.generateSecret(desKey);
    // Cipher对象实际完成解密操作
    Cipher cipher = Cipher.getInstance("DES");
    // 用密匙初始化Cipher对象
    cipher.init(Cipher.DECRYPT_MODE, securekey, random);
    // 真正开始解密操作
    return cipher.doFinal(src);
  }
}

DES加解密案例:

public class Demo01 {
  // 1.配置密钥
  private static String PASSWORD = "95880288";
  public static void main(String[] args) throws Exception {
    // 2.需要加密的内容
    String content = "xxx";
    // 3.使用DES 加密
    byte[] encryptContent = DES.encrypt(content.getBytes(), PASSWORD);
    System.out.println("加密后内容:" + new String(encryptContent));
    // 4.使用DES 解密
    byte[] decrypt = DES.decrypt(encryptContent, PASSWORD);
    System.out.println("解密后内容:" + new String(decrypt));
  }
}

2. 非对称加密

  • 使用一对密钥:一个用于加密信息,另一个则用于解密信息。
  • 两个密钥之间存在着相互依存关系:即用其中任一个密钥加密的信息只能用另一个密钥进行解密。
  • 其中加密密钥不同于解密密钥,公钥加密私钥解密,反之也可私钥加密公钥解密。
  • 密钥依据性质划分,将其中的一个向外界公开,称为公钥;另一个则自己保留,称为私钥。
  • 公钥(Public key)常用于数据加密(用对方公钥加密)或签名验证(用对方公钥解密),私钥(Private key)常用于数据解密(发送方用接收方公钥加密)或数字签名(用自己私钥加密)。

优点机密性、完整性、抗抵赖性

举个例子:

使用过程:

  1. 乙方生成两把密钥(公钥和私钥)
  2. 甲方获取乙方的公钥,然后用它对信息加密。
  3. 乙方得到加密后的信息,用私钥解密,乙方也可用私钥加密字符串
  4. 甲方获取乙方私钥加密数据,用公钥解密

优缺点优点难破解,缺点加密速度慢。

常用算法RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)

3. 代码实现

先写RSA 工具类:

/**
 * RSA加解密工具类
 * 
 */
public class RSAUtil {
  public static String publicKey; // 公钥
  public static String privateKey; // 私钥
  /**
   * 生成公钥和私钥
   */
  public static void generateKey() {
    // 1.初始化秘钥
    KeyPairGenerator keyPairGenerator;
    try {
      keyPairGenerator = KeyPairGenerator.getInstance("RSA");
      SecureRandom sr = new SecureRandom(); // 随机数生成器
      keyPairGenerator.initialize(512, sr); // 设置512位长的秘钥
      KeyPair keyPair = keyPairGenerator.generateKeyPair(); // 开始创建
      RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
      RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
      // 进行转码
      publicKey = Base64.encodeBase64String(rsaPublicKey.getEncoded());
      // 进行转码
      privateKey = Base64.encodeBase64String(rsaPrivateKey.getEncoded());
    } catch (NoSuchAlgorithmException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
  /**
   * 私钥匙加密或解密
   * 
   * @param content
   * @param privateKeyStr
   * @return
   */
  public static String encryptByprivateKey(String content, String privateKeyStr, int opmode) {
    // 私钥要用PKCS8进行处理
    PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyStr));
    KeyFactory keyFactory;
    PrivateKey privateKey;
    Cipher cipher;
    byte[] result;
    String text = null;
    try {
      keyFactory = KeyFactory.getInstance("RSA");
      // 还原Key对象
      privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
      cipher = Cipher.getInstance("RSA");
      cipher.init(opmode, privateKey);
      if (opmode == Cipher.ENCRYPT_MODE) { // 加密
        result = cipher.doFinal(content.getBytes());
        text = Base64.encodeBase64String(result);
      } else if (opmode == Cipher.DECRYPT_MODE) { // 解密
        result = cipher.doFinal(Base64.decodeBase64(content));
        text = new String(result, "UTF-8");
      }
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return text;
  }
  /**
   * 公钥匙加密或解密
   * 
   * @param content
   * @param privateKeyStr
   * @return
   */
  public static String encryptByPublicKey(String content, String publicKeyStr, int opmode) {
    // 公钥要用X509进行处理
    X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyStr));
    KeyFactory keyFactory;
    PublicKey publicKey;
    Cipher cipher;
    byte[] result;
    String text = null;
    try {
      keyFactory = KeyFactory.getInstance("RSA");
      // 还原Key对象
      publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
      cipher = Cipher.getInstance("RSA");
      cipher.init(opmode, publicKey);
      if (opmode == Cipher.ENCRYPT_MODE) { // 加密
        result = cipher.doFinal(content.getBytes());
        text = Base64.encodeBase64String(result);
      } else if (opmode == Cipher.DECRYPT_MODE) { // 解密
        result = cipher.doFinal(Base64.decodeBase64(content));
        text = new String(result, "UTF-8");
      }
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return text;
  }
  // 测试方法
  public static void main(String[] args) {
    /**
     * 注意: 私钥加密必须公钥解密 公钥加密必须私钥解密
     */
    System.out.println("-------------生成两对秘钥,分别发送方和接收方保管-------------");
    RSAUtil.generateKey();
    System.out.println("公钥匙给接收方:" + RSAUtil.publicKey);
    System.out.println("私钥给发送方:" + RSAUtil.privateKey);
    System.out.println("-------------第一个栗子,私钥加密公钥解密-------------");
    // String textsr = "早啊,你吃早饭了吗?O(∩_∩)O~";
    // // 私钥加密
    // String cipherText = RSAUtil.encryptByprivateKey(textsr,
    // RSAUtil.privateKey, Cipher.ENCRYPT_MODE);
    // System.out.println("发送方用私钥加密后:" + cipherText);
    // // 公钥解密
    // String text = RSAUtil.encryptByPublicKey(cipherText,
    // RSAUtil.publicKey, Cipher.DECRYPT_MODE);
    // System.out.println("接收方用公钥解密后:" + text);
    System.out.println("-------------第二个栗子,公钥加密私钥解密-------------");
    // 公钥加密
    String textsr = "吃过啦!你吃了吗?O(∩_∩)O~";
    String cipherText = RSAUtil.encryptByPublicKey(textsr, RSAUtil.publicKey, Cipher.ENCRYPT_MODE);
    System.out.println("接收方用公钥加密后:" + cipherText);
    // 私钥解密
    String text = RSAUtil.encryptByprivateKey(cipherText, RSAUtil.privateKey, Cipher.DECRYPT_MODE);
    System.out.print("发送方用私钥解密后:" + text);
  }
}

使用公钥加密和私钥解密案例

public static void main(String[] args) {
    // 1. 生成(公钥和私钥)密钥对
    RSAUtil.generateKey();
    System.out.println("公钥:" + RSAUtil.publicKey);
    System.out.println("私钥:" + RSAUtil.privateKey);
    System.out.println("----------公钥加密私钥解密-------------");
    // 使用 公钥加密,私钥解密
    String textsr = "张三";
    String encryptByPublic = RSAUtil.encryptByPublicKey(textsr, RSAUtil.publicKey, Cipher.ENCRYPT_MODE);
    System.out.println("公钥加密:" + encryptByPublic);
    String text = RSAUtil.encryptByprivateKey(encryptByPublic, RSAUtil.privateKey, Cipher.DECRYPT_MODE);
    System.out.print("私钥解密:" + text);
  }

使用私钥加密和公钥解密案例:

// 1. 生成(公钥和私钥)密钥对
    RSAUtil.generateKey();
    System.out.println("公钥:" + RSAUtil.publicKey);
    System.out.println("私钥:" + RSAUtil.privateKey);
    System.out.println("----------私加密公钥解密-------------");
    // 使用 私加密,公钥解密
    String textsr = "yushengjun";
    String encryptByprivate = RSAUtil.encryptByprivateKey(textsr, RSAUtil.privateKey, Cipher.ENCRYPT_MODE);
    System.out.println("私钥加密后:" + encryptByprivate);
    String encryptByPublic = RSAUtil.encryptByPublicKey(encryptByprivate, RSAUtil.publicKey, Cipher.DECRYPT_MODE);
    System.out.println("公钥解密后:" + encryptByPublic);


目录
相关文章
|
6天前
|
存储 安全 数据安全/隐私保护
安全升级!Python AES加密实战,为你的代码加上一层神秘保护罩
【9月更文挑战第12天】在软件开发中,数据安全至关重要。本文将深入探讨如何使用Python中的AES加密技术保护代码免受非法访问和篡改。AES(高级加密标准)因其高效性和灵活性,已成为全球最广泛使用的对称加密算法之一。通过实战演练,我们将展示如何利用pycryptodome库实现AES加密,包括生成密钥、初始化向量(IV)、加密和解密文本数据等步骤。此外,还将介绍密钥管理和IV随机性等安全注意事项。通过本文的学习,你将掌握使用AES加密保护敏感数据的方法,为代码增添坚实的安全屏障。
23 8
|
8天前
|
存储 安全 算法
RSA在手,安全我有!Python加密解密技术,让你的数据密码坚不可摧
【9月更文挑战第11天】在数字化时代,信息安全至关重要。传统的加密方法已难以应对日益复杂的网络攻击。RSA加密算法凭借其强大的安全性和广泛的应用场景,成为保护敏感数据的首选。本文介绍RSA的基本原理及在Python中的实现方法,并探讨其优势与挑战。通过使用PyCryptodome库,我们展示了RSA加密解密的完整流程,帮助读者理解如何利用RSA为数据提供安全保障。
22 5
|
12天前
|
存储 安全 算法
显微镜下的安全战!Python加密解密技术,透视数字世界的每一个安全细节
【9月更文挑战第7天】在数字世界中,数据安全至关重要。Python加密解密技术如同显微镜下的精密工具,确保信息的私密性和完整性。以大型医疗机构为例,通过AES和RSA算法的结合,既能高效加密大量医疗数据,又能安全传输密钥,防止数据泄露。以下是使用Python的`pycryptodome`库实现AES加密和RSA密钥交换的简化示例。此方案不仅提高了数据安全性,还为数字世界的每个细节提供了坚实保障,引领我们迈向更安全的未来。
20 1
|
18天前
|
安全 网络安全 数据安全/隐私保护
网络安全漏洞与加密技术:保护信息的艺术
【8月更文挑战第31天】在数字时代,网络安全和信息安全的重要性日益凸显。本文将探讨网络安全漏洞、加密技术以及提升安全意识等方面的内容。我们将通过实际代码示例和案例分析,深入了解网络攻击者如何利用安全漏洞进行攻击,以及如何运用加密技术来保护数据安全。同时,我们还将讨论如何提高个人和组织的安全意识,以应对不断变化的网络安全威胁。让我们一起探索这个充满挑战和机遇的领域吧!
|
24天前
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
95 1
|
18天前
|
安全 开发者 数据安全/隐私保护
Xamarin 的安全性考虑与最佳实践:从数据加密到网络防护,全面解析构建安全移动应用的六大核心技术要点与实战代码示例
【8月更文挑战第31天】Xamarin 的安全性考虑与最佳实践对于构建安全可靠的跨平台移动应用至关重要。本文探讨了 Xamarin 开发中的关键安全因素,如数据加密、网络通信安全、权限管理等,并提供了 AES 加密算法的代码示例。
30 0
|
18天前
|
SQL 安全 算法
网络安全漏洞与加密技术:保护信息的关键
【8月更文挑战第31天】在数字化时代,信息安全成为我们每个人都必须面对的问题。本文将探讨网络安全的漏洞、加密技术以及如何提高安全意识来保护我们的信息。我们将通过一些代码示例,更深入地理解这些概念。无论你是网络专家还是普通用户,这篇文章都将为你提供有价值的信息。让我们一起探索这个充满挑战和机遇的网络世界吧!
|
20天前
|
SQL 监控 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【8月更文挑战第29天】在数字化时代,网络安全和信息安全成为了全球关注的焦点。本文将探讨网络安全漏洞、加密技术以及提升个人和企业的安全意识等方面的重要性。我们将通过实例分析,了解如何防范网络攻击,保护数据安全,并提高对网络安全威胁的认识。
|
25天前
|
安全 网络安全 数据安全/隐私保护
|
3天前
|
SQL 安全 网络安全
网络安全与信息安全:构建防线的三大支柱在数字时代,网络安全和信息安全成为了我们不可忽视的重要议题。本文将深入探讨网络安全漏洞、加密技术以及安全意识这三大支柱,帮助您建立更全面的安全防护体系。
本文旨在分享有关网络安全漏洞、加密技术和安全意识的知识。首先,我们将介绍常见的网络安全漏洞及其形成原因;接着,我们将探讨几种主要的加密技术及其应用;最后,我们将强调提高安全意识的重要性并提供实用的建议。通过这些内容,读者可以更好地理解如何在日常生活和工作中保护自己的信息安全。
23 9