在线支付系列【3】支付安全之对称和非对称加密

news2024/11/16 19:45:11

有道无术,术尚可求,有术无道,止于术。

文章目录

    • 前言
    • 信息安全
    • 加密机制
      • 核心概念
      • 对称加密
      • 非对称加密
    • JCE
      • 对称加解密
        • 1. 创建密钥
        • 2. 加密
        • 3. 解密
      • 非对称加解密
        • 1. 创建密钥
        • 2. 公钥加密
        • 3. 私钥解密

前言

支付和金钱挂钩,支付安全显得尤为重要,微信、支付宝等第三方支付公司,为了确保支付安全问题,都下足了不少功夫,其底层还是和信息安全密切挂钩,所以在这之前,我们需要了解各种安全机制,才能更好地了解支付流程和安全性问题。

信息安全

信息安全是一个很广泛的概念,涉及计算机和网络系统的各个方面。从总体上来讲,信息安全有5个基本要素∶

  1. 机密性∶确保信息不暴露给未授权的实体或进程。

  2. 完整性∶只有得到允许的人才能够修改数据,并能够判别数据是否已被篡改。

  3. 可用性∶得到授权的实体在需要时可访问数据。

  4. 可控性∶可以控制授权范围内的信息流向和行为方式。

  5. 可审查性∶对出现的安全问题提供调查的依据和手段。

加密机制

数据加密即对明文(未经加密的数据)按照某种加密算法(数据的变换算法)进行处理,而形成难以理解的密文(经加密后的数据)。即使密文被截获,截获方也无法或难以解码,从而防止泄露信息。

按照加密密钥和解密密钥的异同,有两种密钥体制,分别是对称密码体制非对称密码体制

核心概念

1、明文

加密前的消息叫明文(plain text)。比如小明给小红发送一封情书没有加密,只要被截取,那么会直接看到明文的内容信息。连篇的土味情话被看到,盗信者直呼辣眼睛😭😭😭
在这里插入图片描述
2、密文

加密后的文本叫密文(cipher text)。为了防止别人看到,小明对情书内容进行加密,加密后内容变成了不可读的内容,就算被窃取,盗信者也无法看懂其内容。
在这里插入图片描述

3、密钥

拥有钥匙的人,使用钥匙将明文变为密文,使用钥匙将密文解析为明文,这把钥匙叫做秘钥(key)。

在这里插入图片描述

4、加密

使用秘钥,将明文变为密文的过程叫做加密(encrypt)。

5、解密

使用秘钥,将密文还原为明文的过程叫做解密(decrypt)。

6、加密算法

加密算法是一种密码学算法,就是指将明文变成密文的加密技术。所有的加密算法都是公开的,而算法使用的密钥则必须保密。

对称加密

对称加密加密和解密采用相同的密钥。因为只使用一个密钥,密钥必须保密,一旦被窃取,消息会被破解。其优点是运算速度快。

它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信的安全性至关重要。

工作流程

  1. 小明使用某种加密算法生成一个秘钥,并将这个秘钥给小红。
  2. 小明使用秘钥将情书进行加密,变为密文,并发送给小红。
  3. 小红收到情书后,使用秘钥将密文还原为明文。
    在这里插入图片描述

非对称加密

非对称加密公钥私钥两个概念,私钥自己拥有,不能给别人,公钥公开。比对称加密安全,但是运算速度更慢。

工作流程

  1. 小红使用某种加密算法生成一对密钥(公钥和私钥),并将这个公钥给小明。
  2. 得到公钥的小明使用该密钥对机密信息进行加密后再发送给小红。
  3. 小红用自己的专用私钥对加密后的信息进行解密。
    在这里插入图片描述
    在传输过程中,即使攻击者截获了传输的密文,并得到了公钥,也无法破解密文,因为只有小红的私钥才能解密密文。

JCE

JCEJava Cryptography Extension三个单词的缩写,译为Java 加密扩展,是JDK 1.4 提供的一个用于加密、密钥生成算法等功能的扩展包。

在这里插入图片描述
接下来我们使用 JCE 实现对称、非对称加解密。

对称加解密

1. 创建密钥

创建密钥需要创建一个javax.crypto.KeyGenerator密钥生成器对象,KeyGenerator提供对称密钥生成器的功能,使用此类的 getInstance 方法获取实例对象。

KeyGenerator 对象可重复使用,也就是说,在生成密钥后,可以重复使用同一个KeyGenerator对象来生成更多的密钥。

KeyGenerator.getInstance()方法返回指定算法的密钥生成器对象,三个重载方法说明如下:

// 返回生成指定算法的秘密密钥的 KeyGenerator 对象。
// algorithm:密钥算法的标准名称
public static final KeyGenerator getInstance(String algorithm) throws NoSuchAlgorithmException
// 返回生成指定算法的秘密密钥的 KeyGenerator 对象。
// algorithm:密钥算法的标准名称
// provider:提供者的名称
public static final KeyGenerator getInstance(String algorithm,String provider)throws NoSuchAlgorithmException,NoSuchProviderException
// 返回生成指定算法的秘密密钥的 KeyGenerator 对象。
// algorithm:密钥算法的标准名称
// provider:提供者对象
public static final KeyGenerator getInstance(String algorithm,Provider provider)throws NoSuchAlgorithmException

该方法需要两个重要参数:算法名称、服务提供者。

加密服务提供者简称CSPjava.security.Provider是所有安全服务提供程序的基类。在进行加解密运算时,需要指定一个CSPJDK默认安装并配置了一个或多个提供程序,也可以注册第三方或自定义服务提供者(例如第三方加密机)。如果没有指定该参数,会从可用的提供者中选取第一个。

通过以下代码,可以获取当前JDK环境所有提供者:

Provider[] providers = Security.getProviders();
  for (Provider provider : providers) {
 	String name = provider.getName();
 	double version = provider.getVersion();
	System.out.println(name + ": " + version);
}
// 输出结果
SUN1.8
SunRsaSign1.8
SunEC1.8
SunJSSE1.8
SunJCE1.8
SunJGSS1.8
SunSASL1.8
XMLDSig1.8
SunPCSC1.8
SunMSCAPI1.8

算法名称:密钥算法的标准名称。常用的对称算法有:AES、3DES、SM1(国密JDK不支持)、SM4(国密)等。

算法名称秘钥长度加密强度性能版权
DES56美国
3DES168美国
IDEA128瑞士
AES128 192 256美国
SM1128中国
SM4128中国

创建了秘钥生成器后,还需要调用init 方法进行初始化。常用方法:

// 初始化此密钥生成器,使其具有确定的密钥大小。
// 参数:keysize  密钥长度。这是特定于算法的一种规格,是以位数为单位指定的。
public final void init(int keysize)

密钥长度是一个重要的参数,每种算法都有其支持的长度,长度越长的情况下,暴力破解的时间就越长。长度单位为位(bit)

生成对称密钥代码如下:

// 获取密钥生成器,指定算法为AES
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
// 初始化
keyGenerator.init(128);
// 生成公钥
SecretKey secretKey = keyGenerator.generateKey();
// 打印秘钥:LDDoCClZOvP9ZncFM19jZg==
byte[] keyEncoded = secretKey.getEncoded();
System.out.println(Base64.getEncoder().encodeToString(keyEncoded));

2. 加密

在上一步骤中,我们生成了一个Base64编码的秘钥字符串:LDDoCClZOvP9ZncFM19jZg==,接下来我们使用该秘钥进行加密。

加解密时,需要使用JCE中的javax.crypto.Cipher对象。此类为加密和解密提供密码功能。它构成了Java Cryptographic Extension (JCE) 框架的核心。

调用getInstance方法获取该对象实例,该方法需要一个字符串参数。

// 返回实现指定转换的 Cipher 对象。此方法从首选 Provider 开始遍历已注册安全提供者列表。
// 参数:transformation - 转换的名称,例如 DES/CBC/PKCS5Padding。
public static final Cipher getInstance(String transformation)

transformation 翻译过来是转换的意思,可以理解为一个转换规则,由三部分组成算法/加密模式/填充规则

算法就是标准的算法名称,之间我们已经介绍过了。

加密模式主要有以下两种:

  • ECB(电码本模式),将明文分成若干小段, 然后对每小段进行加密
  • CBC(密码分组链接模式),先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再使用密钥进行加密

填充规则:在分组密码中,当数据长度不符合分组长度时,需要按一定的方式,将尾部明文分组进行填充,这种将尾部分组数据填满的方法称为填充(Padding)。

填充规则主要有以下几种:

  • NOPADDING:即不填充,要求明文的长度,必须是加密算法分组长度的整数倍。
  • ANSIX9.23:在填充字节序列中,最后一个字节填充为需要填充的字节长度,其余字节填充0。
  • PKCS5PADDING:在填充字节序列中,每个字节填充为需要填充的字节长度。

以下列举了几种算法对应的转换名称:

算法转换名称
AESAES/CBC/NoPadding
AESAES/CBC/PKCS5Padding
AESAES/ECB/NoPadding
AESAES/ECB/PKCS5Padding
DESDES/CBC/NoPadding
DESDES/CBC/PKCS5Padding
DESDES/ECB/NoPadding
DESDES/ECB/PKCS5Padding

通过以上知识,加密代码如下:

        // 原文
        String message = "爱老虎油~";
        // Base64编码的秘钥字符串
        String keyBase64 = "LDDoCClZOvP9ZncFM19jZg==";
        // 获取Cipher 对象
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        // 将秘钥字符串转为秘钥对象
        SecretKey keySpec = new SecretKeySpec(Base64.getDecoder().decode(keyBase64), "AES");
        // 初始化,设置为加密模式,并传入秘钥
        cipher.init(Cipher.ENCRYPT_MODE, keySpec);
        // 加密运算
        byte[] cipherData = cipher.doFinal(message.getBytes(StandardCharsets.UTF_8));
        // 打印密文:SJ+6fnHAWt9ui7Pq3AlFmg==
        System.out.println("密文:" + Base64.getEncoder().encodeToString(cipherData));

3. 解密

解密就比较简单了,使用秘钥,调用Cipher 对象进行解密即可,代码如下:

        // 解密
        // 密文
        String enBase64Message="SJ+6fnHAWt9ui7Pq3AlFmg==";
        // Base64编码的秘钥字符串
        String enKeyBase64 = "LDDoCClZOvP9ZncFM19jZg==";
        // 获取Cipher 对象
        Cipher deCipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        // 将秘钥字符串转为秘钥对象
        SecretKey deKeySpec = new SecretKeySpec(Base64.getDecoder().decode(enKeyBase64), "AES");
        // 初始化,设置解密模式,并传入秘钥
        deCipher.init(Cipher.DECRYPT_MODE, deKeySpec);
        // 解密运算
        byte[] bytes = deCipher.doFinal(Base64.getDecoder().decode(enBase64Message));
        // 打印明文
        System.out.println("明文:" + new String(bytes));

执行结果如下:

密文:SJ+6fnHAWt9ui7Pq3AlFmg==
明文:爱老虎油~

非对称加解密

1. 创建密钥

使用KeyPairGenerator.getInstance()获取一个秘钥生成器,参数类型和对称秘钥一样,区别在于算法名称不一样。

常见的非对称加密算法有:

  • RSA:性能比较快,如果想要较高的加密难度,需要很长的秘钥。
  • ECC:基于椭圆曲线提出。是目前加密强度最高的非对称加密算法。
  • SM2:同样基于椭圆曲线问题设计。最大优势就是国家认可和大力支持。

代码如下

        // 获取非对称密钥生成器
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        // 初始化
        keyPairGenerator.initialize(512);
        // 生成秘钥对
        KeyPair keyPair = keyPairGenerator.generateKeyPair(); // 获取内部密钥对
        PrivateKey privateKey = keyPair.getPrivate(); // 私钥
        PublicKey publicKey = keyPair.getPublic(); // 公钥
        // 打印秘钥:
        System.out.println("公钥:" + Base64.getEncoder().encodeToString(publicKey.getEncoded()));
        System.out.println("私钥:" + Base64.getEncoder().encodeToString(privateKey.getEncoded()));

执行结果

公钥:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL8SAEW1o3lMg4XVQi29n7XqQ02ei0voeKcXvj+bVH1Fu+8W9CzSLpnlHHQgL9bl8Kly/5/y0TgE+NBxsrdfZo8CAwEAAQ==
私钥:MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAvxIARbWjeUyDhdVCLb2ftepDTZ6LS+h4pxe+P5tUfUW77xb0LNIumeUcdCAv1uXwqXL/n/LROAT40HGyt19mjwIDAQABAkEAm4TsYdERaSbFGsbVIePpPimadHAqkzN6GQ8zVBR7NaaEeeFjZ/XX/FmNTvrKp2IXN5p0d0LZDOUPq3UL/nzpQQIhAP3JnMQBa9yeb3NzmCguaDwty8175sEDsB/NJLrULuehAiEAwLxrkZItOaoFRV6c78qPsHQGKSTQQBAFS2vycehW4C8CIQDH6wwM8zmunzgYcFTKQlRmI4VKJ3JNVcRmKMnoSsFwQQIgTob2lPMn9gyt5RuteY3giZZcRDs5lkBwx9ANkheF/gUCIAwBGYCzZHNsEr6PIfImrwxRLs/MFPbbQAHpUQaLaWL9

2. 公钥加密

使用公钥对原文数据进行加密。

        // 使用公钥加密
        // 原文
        String message = "爱老虎油~";
        // Base64编码的公钥字符串
        String publicKeyBase64 = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMEC2gOpKGTzCdJ4flb6Oj9QmbwVANmwLn0zBkZINepGEeWnvORxlteakSK03O2XgtHSGyW4r520KBtvKEcdFAECAwEAAQ==";
        // 获取Cipher 对象
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        // 将公钥字符串转为公钥对象
        X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyBase64));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKeyByValue = keyFactory.generatePublic(bobPubKeySpec);
        // 初始化,设置为加密模式,并传入公钥
        cipher.init(Cipher.ENCRYPT_MODE, publicKeyByValue);
        // 加密运算
        byte[] cipherData = cipher.doFinal(message.getBytes(StandardCharsets.UTF_8));
        // 打印密文:mMzlg+65E1QKJi+zOVdyzbYrq526fOd7ir0Zlkbvo2q37iGvrMiq/y9P4teBtPe9PRJF7HCsmezZ3/M0aiQbyw==
        System.out.println("密文:" + Base64.getEncoder().encodeToString(cipherData));

3. 私钥解密

使用私钥对密文数据进行解密。

        // 使用私钥解密
        // 密文
        String enBase64Message = "mMzlg+65E1QKJi+zOVdyzbYrq526fOd7ir0Zlkbvo2q37iGvrMiq/y9P4teBtPe9PRJF7HCsmezZ3/M0aiQbyw==";
        // Base64编码的私钥字符串
        String privateKeyBase64 = "MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAwQLaA6koZPMJ0nh+Vvo6P1CZvBUA2bAufTMGRkg16kYR5ae85HGW15qRIrTc7ZeC0dIbJbivnbQoG28oRx0UAQIDAQABAkEAmQgjx6dFadTxQrlaoqe/qxfC7MdSZ0czdP0RyoPSi64k942Rj46in5zDw60SynysVvMmVinxPPFS+6rv5kIWaQIhAPMXt8l7jPGmF6pYTmE2cx9OjB4Q9q8uhfIKZc0E7T9HAiEAy0JkNwSVxK76I9mFZpoRSfH37xAqLyUKhdCRAn5fBncCIQDGw3Pg6Ia750SeYgnkbrL+vCjRRKmPX4jh+SJ32jlqbQIgIXe6FpELtAn3qAV+AKnnpNxRraxktcSMmgIAjn+OV/sCIFlpFzkKXkW2cTv6oVHbFkqgrDPhTAXbshsa/U301Oac";
        // 获取Cipher 对象
        Cipher deCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        // 将私钥字符串转为私钥对象
        PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyBase64));
        KeyFactory privateKeyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKeyByValue = privateKeyFactory.generatePrivate(privateKeySpec);
        // 初始化,设置解密模式,并传入私钥
        deCipher.init(Cipher.DECRYPT_MODE, privateKeyByValue);
        // 解密运算
        byte[] bytes = deCipher.doFinal(Base64.getDecoder().decode(enBase64Message));
        // 打印明文: 明文:爱老虎油~
        System.out.println("明文:" + new String(bytes));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/173473.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

域名被封的解决方案

如果您的域名被封,可能是域名下网站存在非法信息或敏感内容,导致被GFW屏蔽。 封禁原因及解决方案如下: 1. 域名解析的IP纳入黑名单 这种情况只需更换IP即可恢复正常,但换IP也只能解除一时的燃眉之急,一旦又被GFW发现很…

MySQL进阶——视图(view)

1. 视图 1.1 视图介绍 视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。 通俗的讲,视图只保存了查询的SQL逻辑&#xf…

MySQL详细教程,2023年硬核学习路线

文章目录前言1. 数据库的相关概念1.1 数据1.2 数据库1.3 数据库管理系统1.4 数据库系统1.5 SQL2. MySQL数据库2.1 MySQL安装2.2 MySQL配置2.2.1 添加环境变量2.2.2 新建配置文件2.2.3 初始化MySQL2.2.4 注册MySQL服务2.2.5 启动MySQL服务2.3 MySQL登录和退出2.4 MySQL卸载2.5 M…

【Python】如何为Matplotlib图像添加标签?

一、添加文本标签 plt.text() 用于在绘图过程中,在图像上指定坐标的位置添加文本。需要用到的是plt.text()方法。 其主要的参数有三个: plt.text(x, y, s)其中x、y表示传入点的x和y轴坐标。s表示字符串。 需要注意的是,这里的坐标&#x…

基于Springboot+Mybatis+mysql+vue电影院在线售票系统

基于SpringbootMybatismysqlvue电影院在线售票系统一、系统介绍二、所用技术三、功能展示1.主页(普通用户)2.影院管理员相关功能(影院管理员)3.系统管理权限(管理员)四、获取源码一、系统介绍 电影院网上售票系统拥有三种角色,用户、工作人员…

三星K2200复印机提示更换传输卷问题的简单处理

故障现象: 三星K2200复印机开机后提示更换传输卷; 故障分析与处理: 三星K2200复印机提示更换传输卷是转印带使用寿命到期,三星k2200复印件更换传输卷,是指转印带使用寿命到期了,需要更换传输卷。如果这台机器报传输卷一般是这台机器也有一条转印带,如果报这个看看上面…

C/C++数据结构(十一)—— 平衡二叉树(AVL树)

文章目录1. AVL树的概念2. AVL树的结点3. AVL树的插入🍑 更新平衡因子🍑 插入函数的实现4. AVL树的旋转🍑 左单旋🍑 右单旋🍑 左右双旋🍑 右左双旋🍑 总结6. AVL树的删除🍑 算法思想…

基于EasyExcel实现百万级数据导入导出

基于EasyExcel实现百万级数据导入导出 在项目开发中往往需要使用到数据的导入和导出,导入就是从Excel中导入到DB中,而导出就是从DB中查询数据然后使用POI写到Excel上。 大数据的导入和导出,相信大家在日常的开发、面试中都会遇到。 很多问题只要这一次…

2022-12-08版本:Open Inventor Toolkit SDK Crack

为什么使用 Open Inventor Toolkit Open Inventor SDK 是一种商业 3D 软件开发工具包 ( SDK ),适用于医疗和牙科、石油和天然气、工程领域的专业应用。 Open Inventor其面向对象的 API、可扩展的架构及其大量高级组件为软件开发人员提供了一个高级平台,…

JUC面试(五)——Collection线程不安全

Collection线程不安全 前言 当我们执行下面语句的时候&#xff0c;底层进行了什么操作 new ArrayList<Integer>(); 底层创建了一个空的数组&#xff0c;伴随着初始值为10 当执行add方法后&#xff0c;如果超过了10&#xff0c;那么会进行扩容&#xff0c;扩容的大小…

Spring源码学习:三级缓存的必要性

目录前言概述正文Spring的生命周期Spring中循环依赖场景Spirng中的三级缓存Spring一级缓存解决循环依赖Spring二级缓存解决循环依赖Spring三级缓存解决循环依赖总结前言 工作中可能会碰到循坏依赖问题&#xff0c;所以了解其Spring设计原理&#xff0c;对于解决问题更加高效。…

c++ - 第26节 - c++知识梳理

1.STL知识梳理 STL知识掌握&#xff1a; 底层实现角度&#xff1a;六大组件 上层用的角度&#xff1a;容器、算法、迭代器 底层实现角度&#xff1a; 注&#xff1a; 1.可以认为迭代器是容器和算法的粘合剂&#xff0c;如果没有迭代器&#xff0c;那么算法要访问容器有两大问题…

三种循环的区别

三种循环的区别:1.for循环和while循环先判断条件是否成立&#xff0c;然后决定是否执行循环体&#xff08;先判断后执行)2.do..while循环先执行一次循环体&#xff0c;然后判断条件是否成立&#xff0c;是否继续执行循环体(先执行后判断)for和while的区别:1.条件控制语句所控制…

英语学习打卡day2

2023.1.20 1.if虚拟语气的倒装 If it were not for your help, I would be homeless. Were it not for your help, I would be homeless. 要不是你的帮助&#xff0c;我会无家可归。 2.plausible adj.似乎有理的;有道理的 plaus拍手&#xff0c;鼓掌 ible可…的- >能鼓掌的…

注册中心(一)

注册中心&#xff08;一&#xff09; 业务痛点 项目的架构从以前的单体结构发展到现在的微服务。不仅服务的数量变的多了&#xff0c;而且服务都是多节点的部署。 假如在serviceA去调用serviceB&#xff0c;当serviceA会在配置中配置一个serviceB的ip和port进行通信。 当se…

如何安装配置hbase

当完成hdfs、zookeeper的安装配置后&#xff0c;现在进入到hbase的安装和配置环节。这样的做的目的之一是要把海量的数据存入到hbase数据库中。JDK版本的要求hbase对JDK版本是有要求的&#xff0c;不是JDK版本越高越好&#xff0c;根据我走过的坑&#xff0c;目前最好的JDK版本…

LeetCode刷题复盘笔记—一文搞懂贪心算法之122. 买卖股票的最佳时机 II问题(贪心算法系列第三篇)

今日主要总结一下可以0贪心算法解决的一道题目&#xff0c;122. 买卖股票的最佳时机 II 题目&#xff1a;122. 买卖股票的最佳时机 II Leetcode题目地址 题目描述&#xff1a; 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&am…

深度学习实战 —— LSTM轨迹预测

前言 最近写了一份用LSTM之类的序列模型+SeNet预测轨迹,经过一系列调试效果最后比较理想了。记录下~ 上效果: 一些效果图 训练误差图: 测试误差图: 训练损失: 测试损失: batch平均耗时: 拟合效果:

(day7) 自学Java——面向对象进阶

目录 1.static静态变量 ​编辑 2.继承 ​编辑 3.多态 4.包、final、权限修饰符、代码块 5.抽象类 6.接口 7.内部类 非原创&#xff0c;为方便自己后期复习 1.static静态变量 静态存储位置的数据是共享的 练习&#xff1a;定义数组工具类 需求&#xff1a;在实际开发…

深度卷积对抗神经网络 基础 第二部分 DC-GANs

深度卷积对抗神经网络 基础 第二部分 DC-GANs DC-GANs &#xff08;DC-GANs Deep convolutional GAN&#xff09;是基于GANs的一种专门对图片生成的一种模型&#xff0c;其通过卷积操作来进行图片的一些基本操作来实现模型的功能。 激活函数 Activations 激活函数是任何输入…