Java实现国密算法SM2,SM3,SM4,并且实现ECB和CBC模式

2023-11-15

代码中实现了电码本ECB模式和密文分组连接CBC模式,SM3.java和SM4.java为算法实现类,utils的都是根据实现类写的工具,可以根据需要调用杂凑算法SM3的杂凑功能获得杂凑值。

SM4.java中

sm4_crypt_ecb(SM4_Context ctx, byte[] input)      ECB模式加解密方法,根据密钥判断加解密功能

sm4_crypt_cbc(SM4_Context ctx, byte[] iv, byte[] input)      CBC模式加解密方法,根据密钥判断加解密功能

加密解密通过如下方法:

sm4_setkey_enc(SM4_Context ctx, byte[] key)  设置加密密钥调用上述方法,实现加密

sm4_setkey_dec(SM4_Context ctx, byte[] key)  设置解密密钥调用上述方法,实现解密

需要导入的包为bcprov-jdk16  我用的版本是bcprov-jdk16-1.46

maven中配置依赖:

<dependency>
	<groupId>org.bouncycastle</groupId>
	<artifactId></artifactId>
	<version>1.46</version>
</dependency>

package中class目录如下:

chiper.java

import java.math.BigInteger;  
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;  
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;  
import org.bouncycastle.crypto.params.ECPublicKeyParameters;  
import org.bouncycastle.math.ec.ECPoint; 

public class Cipher {
	 private int ct;  
	    private ECPoint p2;  
	    private SM3Digest sm3keybase;  
	    private SM3Digest sm3c3;  
	    private byte key[];  
	    private byte keyOff;  
	  
	    public Cipher()   
	    {  
	        this.ct = 1;  
	        this.key = new byte[32];  
	        this.keyOff = 0;  
	    }  
	  
	    private void Reset()   
	    {  
	        this.sm3keybase = new SM3Digest();  
	        this.sm3c3 = new SM3Digest();  
	          
	        byte p[] = Util.byteConvert32Bytes(p2.getX().toBigInteger());  
	        this.sm3keybase.update(p, 0, p.length);  
	        this.sm3c3.update(p, 0, p.length);  
	          
	        p = Util.byteConvert32Bytes(p2.getY().toBigInteger());  
	        this.sm3keybase.update(p, 0, p.length);  
	        this.ct = 1;  
	        NextKey();  
	    }  
	  
	    private void NextKey()   
	    {  
	        SM3Digest sm3keycur = new SM3Digest(this.sm3keybase);  
	        sm3keycur.update((byte) (ct >> 24 & 0xff));  
	        sm3keycur.update((byte) (ct >> 16 & 0xff));  
	        sm3keycur.update((byte) (ct >> 8 & 0xff));  
	        sm3keycur.update((byte) (ct & 0xff));  
	        sm3keycur.doFinal(key, 0);  
	        this.keyOff = 0;  
	        this.ct++;  
	    }  
	  
	    public ECPoint Init_enc(SM2 sm2, ECPoint userKey)   
	    {  
	        AsymmetricCipherKeyPair key = sm2.ecc_key_pair_generator.generateKeyPair();  
	        ECPrivateKeyParameters ecpriv = (ECPrivateKeyParameters) key.getPrivate();  
	        ECPublicKeyParameters ecpub = (ECPublicKeyParameters) key.getPublic();  
	        BigInteger k = ecpriv.getD();  
	        ECPoint c1 = ecpub.getQ();  
	        this.p2 = userKey.multiply(k);  
	        Reset();  
	        return c1;  
	    }  
	  
	    public void Encrypt(byte data[])   
	    {  
	        this.sm3c3.update(data, 0, data.length);  
	        for (int i = 0; i < data.length; i++)   
	        {  
	            if (keyOff == key.length)  
	            {  
	                NextKey();  
	            }  
	            data[i] ^= key[keyOff++];  
	        }  
	    }  
	  
	    public void Init_dec(BigInteger userD, ECPoint c1)  
	    {  
	        this.p2 = c1.multiply(userD);  
	        Reset();  
	    }  
	  
	    public void Decrypt(byte data[])   
	    {  
	        for (int i = 0; i < data.length; i++)  
	        {  
	            if (keyOff == key.length)  
	            {  
	                NextKey();  
	            }  
	            data[i] ^= key[keyOff++];  
	        }  
	  
	        this.sm3c3.update(data, 0, data.length);  
	    }  
	  
	    public void Dofinal(byte c3[])   
	    {  
	        byte p[] = Util.byteConvert32Bytes(p2.getY().toBigInteger());  
	        this.sm3c3.update(p, 0, p.length);  
	        this.sm3c3.doFinal(c3, 0);  
	        Reset();  
	    }  
}

SM2.java

import java.math.BigInteger;  
import java.security.SecureRandom;  
  
import org.bouncycastle.crypto.generators.ECKeyPairGenerator;  
import org.bouncycastle.crypto.params.ECDomainParameters;  
import org.bouncycastle.crypto.params.ECKeyGenerationParameters;  
import org.bouncycastle.math.ec.ECCurve;  
import org.bouncycastle.math.ec.ECFieldElement;  
import org.bouncycastle.math.ec.ECPoint;  
import org.bouncycastle.math.ec.ECFieldElement.Fp;  

public class SM2 {
	 //测试参数  
//  public static final String[] ecc_param = {  
//      "8542D69E4C044F18E8B92435BF6FF7DE457283915C45517D722EDB8B08F1DFC3",   
//      "787968B4FA32C3FD2417842E73BBFEFF2F3C848B6831D7E0EC65228B3937E498",   
//      "63E4C6D3B23B0C849CF84241484BFE48F61D59A5B16BA06E6E12D1DA27C5249A",   
//      "8542D69E4C044F18E8B92435BF6FF7DD297720630485628D5AE74EE7C32E79B7",   
//      "421DEBD61B62EAB6746434EBC3CC315E32220B3BADD50BDC4C4E6C147FEDD43D",   
//      "0680512BCBB42C07D47349D2153B70C4E5D7FDFCBFA36EA1A85841B9E46E09A2"   
//  };  
      
    //正式参数  
    public static String[] ecc_param = {   
        "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF",  
        "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC",  
        "28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93",  
        "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123",  
        "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7",  
        "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0"  
    };  
  
    public static SM2 Instance()   
    {  
        return new SM2();  
    }  
  
    public final BigInteger ecc_p;  
    public final BigInteger ecc_a;  
    public final BigInteger ecc_b;  
    public final BigInteger ecc_n;  
    public final BigInteger ecc_gx;  
    public final BigInteger ecc_gy;  
    public final ECCurve ecc_curve;  
    public final ECPoint ecc_point_g;  
    public final ECDomainParameters ecc_bc_spec;  
    public final ECKeyPairGenerator ecc_key_pair_generator;  
    public final ECFieldElement ecc_gx_fieldelement;  
    public final ECFieldElement ecc_gy_fieldelement;  
  
    public SM2()   
    {  
        this.ecc_p = new BigInteger(ecc_param[0], 16);  
        this.ecc_a = new BigInteger(ecc_param[1], 16);  
        this.ecc_b = new BigInteger(ecc_param[2], 16);  
        this.ecc_n = new BigInteger(ecc_param[3], 16);  
        this.ecc_gx = new BigInteger(ecc_param[4], 16);  
        this.ecc_gy = new BigInteger(ecc_param[5], 16);  
  
        this.ecc_gx_fieldelement = new Fp(this.ecc_p, this.ecc_gx);  
        this.ecc_gy_fieldelement = new Fp(this.ecc_p, this.ecc_gy);  
  
        this.ecc_curve = new ECCurve.Fp(this.ecc_p, this.ecc_a, this.ecc_b);  
        this.ecc_point_g = new ECPoint.Fp(this.ecc_curve, this.ecc_gx_fieldelement, this.ecc_gy_fieldelement);  
  
        this.ecc_bc_spec = new ECDomainParameters(this.ecc_curve, this.ecc_point_g, this.ecc_n);  
  
        ECKeyGenerationParameters ecc_ecgenparam;  
        ecc_ecgenparam = new ECKeyGenerationParameters(this.ecc_bc_spec, new SecureRandom());  
  
        this.ecc_key_pair_generator = new ECKeyPairGenerator();  
        this.ecc_key_pair_generator.init(ecc_ecgenparam);  
    }  
}

SM2Utils.java

import java.io.IOException;  
import java.math.BigInteger;  
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;  
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;  
import org.bouncycastle.crypto.params.ECPublicKeyParameters;  
import org.bouncycastle.math.ec.ECPoint; 

public class SM2Utils {
	  //生成随机秘钥对  
    public static void generateKeyPair(){  
        SM2 sm2 = SM2.Instance();  
        AsymmetricCipherKeyPair key = sm2.ecc_key_pair_generator.generateKeyPair();  
        ECPrivateKeyParameters ecpriv = (ECPrivateKeyParameters) key.getPrivate();  
        ECPublicKeyParameters ecpub = (ECPublicKeyParameters) key.getPublic();  
        BigInteger privateKey = ecpriv.getD();  
        ECPoint publicKey = ecpub.getQ();  
          
        System.out.println("公钥: " + Util.byteToHex(publicKey.getEncoded()));  
        System.out.println("私钥: " + Util.byteToHex(privateKey.toByteArray()));  
    }  
      
    //数据加密  
    public static String encrypt(byte[] publicKey, byte[] data) throws IOException  
    {  
        if (publicKey == null || publicKey.length == 0)  
        {  
            return null;  
        }  
          
        if (data == null || data.length == 0)  
        {  
            return null;  
        }  
          
        byte[] source = new byte[data.length];  
        System.arraycopy(data, 0, source, 0, data.length);  
          
        Cipher cipher = new Cipher();  
        SM2 sm2 = SM2.Instance();  
        ECPoint userKey = sm2.ecc_curve.decodePoint(publicKey);  
          
        ECPoint c1 = cipher.Init_enc(sm2, userKey);  
        cipher.Encrypt(source);  
        byte[] c3 = new byte[32];  
        cipher.Dofinal(c3);  
          
//      System.out.println("C1 " + Util.byteToHex(c1.getEncoded()));  
//      System.out.println("C2 " + Util.byteToHex(source));  
//      System.out.println("C3 " + Util.byteToHex(c3));  
        //C1 C2 C3拼装成加密字串  
        return Util.byteToHex(c1.getEncoded()) + Util.byteToHex(source) + Util.byteToHex(c3);  
          
    }  
      
    //数据解密  
    public static byte[] decrypt(byte[] privateKey, byte[] encryptedData) throws IOException  
    {  
        if (privateKey == null || privateKey.length == 0)  
        {  
            return null;  
        }  
          
        if (encryptedData == null || encryptedData.length == 0)  
        {  
            return null;  
        }  
        //加密字节数组转换为十六进制的字符串 长度变为encryptedData.length * 2  
        String data = Util.byteToHex(encryptedData);  
        /***分解加密字串 
         * (C1 = C1标志位2位 + C1实体部分128位 = 130) 
         * (C3 = C3实体部分64位  = 64) 
         * (C2 = encryptedData.length * 2 - C1长度  - C2长度) 
         */  
        byte[] c1Bytes = Util.hexToByte(data.substring(0,130));  
        int c2Len = encryptedData.length - 97;  
        byte[] c2 = Util.hexToByte(data.substring(130,130 + 2 * c2Len));  
        byte[] c3 = Util.hexToByte(data.substring(130 + 2 * c2Len,194 + 2 * c2Len));  
          
        SM2 sm2 = SM2.Instance();  
        BigInteger userD = new BigInteger(1, privateKey);  
          
        //通过C1实体字节来生成ECPoint  
        ECPoint c1 = sm2.ecc_curve.decodePoint(c1Bytes);  
        Cipher cipher = new Cipher();  
        cipher.Init_dec(userD, c1);  
        cipher.Decrypt(c2);  
        cipher.Dofinal(c3);  
          
        //返回解密结果  
        return c2;  
    }  
      
    public static void main(String[] args) throws Exception   
    {  
        //生成密钥对  
        generateKeyPair();  
          
        String plainText = "ererfeiisgod";  
        byte[] sourceData = plainText.getBytes();  
          
        //下面的秘钥可以使用generateKeyPair()生成的秘钥内容  
        // 国密规范正式私钥  
        String prik = "3690655E33D5EA3D9A4AE1A1ADD766FDEA045CDEAA43A9206FB8C430CEFE0D94";  
        // 国密规范正式公钥  
        String pubk = "04F6E0C3345AE42B51E06BF50B98834988D54EBC7460FE135A48171BC0629EAE205EEDE253A530608178A98F1E19BB737302813BA39ED3FA3C51639D7A20C7391A";  
          
        System.out.println("加密: ");  
        String cipherText = SM2Utils.encrypt(Util.hexToByte(pubk), sourceData);  
        System.out.println(cipherText);  
        System.out.println("解密: ");  
        plainText = new String(SM2Utils.decrypt(Util.hexToByte(prik), Util.hexToByte(cipherText)));  
        System.out.println(plainText);  
          
    }  
}

SM3.java

public class SM3 {
	 public static final byte[] iv = { 0x73, (byte) 0x80, 0x16, 0x6f, 0x49,  
		        0x14, (byte) 0xb2, (byte) 0xb9, 0x17, 0x24, 0x42, (byte) 0xd7,  
		        (byte) 0xda, (byte) 0x8a, 0x06, 0x00, (byte) 0xa9, 0x6f, 0x30,  
		        (byte) 0xbc, (byte) 0x16, 0x31, 0x38, (byte) 0xaa, (byte) 0xe3,  
		        (byte) 0x8d, (byte) 0xee, 0x4d, (byte) 0xb0, (byte) 0xfb, 0x0e,  
		        0x4e };  
		      
		    public static int[] Tj = new int[64];  
		      
		    static   
		    {  
		        for (int i = 0; i < 16; i++)   
		        {  
	
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java实现国密算法SM2,SM3,SM4,并且实现ECB和CBC模式 的相关文章

  • 信息隐藏——DCT隐写

    DCT隐写 实验目的 了解DCT的系数隐写 实验内容 Jepg 压缩算法的回顾 用MATLAB实现图像DCT相关操作 完成基于图像DCT的信息隐藏实验 两点法的嵌入和提取 三点法的嵌入和提取 1 Jpeg压缩算法 一 色彩空间转换 RGB空
  • BUUCTF题目N1BOOK部分wp(持续更新)

    第九章 CTF之MISC章 两个部分的flag 附件 stego png 隐写了一个zip文件 zip文件里面是 2 jpg stego png 2 jpg stego png 用 StegSolve Data Extract BGR LS
  • 25个恶意JavaScript 库通过NPM官方包仓库分发

    聚焦源代码安全 网罗国内外最新资讯 编译 代码卫士 专栏 供应链安全 数字化时代 软件无处不在 软件如同社会中的 虚拟人 已经成为支撑社会正常运转的最基本元素之一 软件的安全性问题也正在成为当今社会的根本性 基础性问题 随着软件产业的快速发
  • [CTFshow]吃瓜杯复现wp

    热身
  • ctfshow CRYPTO RSA

    ctfshow CRYPTO RSA babyrsa easyrsa1 easyrsa2 easyrsa3 easyrsa4 easyrsa5 easyrsa6 easyrsa7 easyrsa8 babyrsa 先看txt 直接上脚本 i
  • 哪个进程在访问这个恶意域名???

    哪个进程在访问这个恶意域名 背景 信息安全工程师很多时候需要通过某个恶意域名来判断主机失陷情况 恶意域名特征比较明显的 比较容易通过威胁情报找到相关线索 例如fr minexmr com 通过威胁情查询 该恶意域名比较容易判断该主机感染Wa
  • 文件上传之.htaccess绕过黑名单——upload-labs靶场第四关

    今天继续给大家介绍渗透测试相关知识 本文主要内容是介绍 htaccess绕过黑名单的文件上传方法 并借助upload labs靶场的第四关进行了实战 免责声明 本文所介绍的内容仅做学习交流使用 严禁利用文中技术进行非法行为 否则造成一切严重
  • WebGoat-5.4实验笔记(2)

    webgoat其他项目的学习笔记在我的博客里有 General 总体目标 1 Http Basics HTTP基础知识 点击Http Basics 查看页面信息 显示输入信息后 服务器接收请求后会返回用户的输入信息 并回显给用户 我在Ent
  • Web的基本漏洞--代码执行漏洞RCE

    目录 一 代码执行漏洞的介绍 1 代码执行漏洞的原理 2 常用含有的代码执行漏洞的函数 3 代码执行漏洞的危害 4 代码执行漏洞的防范措施 一 代码执行漏洞的介绍 1 代码执行漏洞的原理 web应用程序是指程序员在代码中使用了一些执行函数例
  • Kali Linux 从入门到精通(一)-概论

    Kali Linux 从入门到精通 一 概论 欢迎关注 https github com Wheeeeeeeeels 基本介绍 1 安全目标 先于攻击者发现和防止漏洞出现 攻击型安全 防护型安全 2 渗透测试 尝试挫败安全防御机制 发现系统
  • 反序列化漏洞原理详解

    Apache shiro简介 Apache Shiro是一个强大且易用的Java安全框架 执行身份验证 授权 密码和会话管理 使用Shiro的易于理解的API 您可以快速 轻松地获得任何应用程序 从最小的移动应用程序到最大的网络和企业应用程
  • [工具使用]黑暗引擎FOFA

    黑暗引擎FOFA FOFA 点我进入 逻辑运算符 搜索子域名domain 搜索指定内容的host全部域名 body cert 搜索选定应用的网站 搜索指定开放端口的IP 搜索指定协议的IP 搜索IP或者网段的信息 搜索指定CSS JS网站
  • 应急响应篇:windows入侵排查

    前言 应急响应 Incident Response Service IRS 是当企业系统遭受病毒传播 网络攻击 黑客入侵等安全事件导致信息业务中断 系统宕机 网络瘫痪 数据丢失 企业声誉受损 并对组织和业务运行产生直接或间接的负面影响时 急
  • 信息收集 (一)Google Hack & robots文件

    一 Google Hack 在渗透测试中 信息收集是尤为重要的一部分 甚至可以占到整个渗透的百分之六十至七十 可见掌握好信息收集的方法十分重要 那GoogleHacking作为常用且方便的信息收集搜索引擎工具 它是利用谷歌搜索强大 可以搜出
  • 为了响应工信部要求,我们整理了这些网络账户注销指南

    福利 网络安全重磅福利 入门 进阶全套282G学习资源包免费分享 今年 1 月份 工信部在 回应网民问手机 App 销户的问题 时 明确表示用户有权删除在平台服务商注册的账户服务 根据 中华人民共和国网络安全法 第四十三条规定 个人发现网络
  • 漏洞常规专业术语

    基础漏洞条例 VUL Vulnerability 漏洞 POC Proof of Concept 漏洞证明 漏洞报告中 通过一段描述或一个样例来证明漏洞确实存在 EXP Exploit 漏洞利用 某个漏洞存在EXP 意思就是该漏洞存在公开的
  • SM2加解密、签名验签

    导论 SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法 在我们国家商用密码体系中被用来替换RSA算法 国产SM2算法 是基于ECC的 但二者在签名验签 加密解密过程中或许有些许区别 目前鄙人还不太清楚 后期有机会的话
  • 2024 信息安全专业毕业设计(论文)选题合集 最新版

    目录 前言 信息安全选题 选题迷茫 选题的重要性 更多选题指导 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研
  • 安全行业招聘信息汇总

    1 阿里巴巴 淘天集团 安全部 社招岗位 Java开发 招聘层级 P5 P6 工作年限 本科毕业1 3年 硕士毕业1 2年 base地点 杭州 职位描述 负责淘天安全部风控基础标签平台0到1能力建设及产品规划和落地 负责标签应用的产品沉淀和
  • 使用 TripleDes、PKCS7 和 ECB 进行 PHP 加密/解密

    我的加密函数工作正常 但是我不知道如何让解密函数给出正确的输出 这是我的加密函数 function Encrypt data secret Generate a key from a hash key md5 utf8 encode sec

随机推荐

  • C++ 类模板之类外实现重载运算符和友元函数

    在同一个CPP中 使用友元函数 同时在类外实现 这里 h cpp未分离 如果分离写法不一样 一般在使用类模板时 将声明和实现放在同一文件中 可命名为 hpp后缀 即 h cpp在同一文件中 1 重载操作符 定义一个类 通过重载 lt lt
  • Windows下vs2013编译ffmpeg源码

    在搜罗网上各种资源以及网上请教各位大声终于在今天晚上编译成功 经测试编译出来的库可正常使用 故可证明编译正确 在此特感谢群里大神的帮助 感谢雷神 现将具体步骤记录如下 本人编译用的是vs2013 在win7系统下 对ffmpeg 3 0进行
  • 在ubuntu 下运行html 文件

    直接用vim 写好html 之后 直接用firefox test html 即可 而不是通常ide 中的点击图标 html 的基本模板 1 2
  • wangEditor4 + vue3.0 创建一个基础的 富文本编辑器

    文章时间 2021 8 13 如果超过太久了 可能文章就会失效了 所以请注意 项目场景 使用 wangEditor 来弄一个 富文本编辑器 实现文章的 添加 和 编辑 问题描述 在网上搜了 使用那个富文本编辑器好 于是就找到了这个 wang
  • Python 的 .py 与 Cython 的 .pxd .pyx .pyd 文件格式之间的主要区别

    http forum digitser cn thread 2227 1 1 html
  • Selenium的介绍与使用

    selenium 是一个用于对web网页进行自动化测试的工具 可以通过它提供的一些方法自动操作浏览器 可以完全模拟人的操作 selenium在Python爬虫中的应用 1 gt 获取动态网页中的数据 一些动态的数据我们在获取的源码中并没有显
  • shell 脚本 修改系统时间

    bin bash if n 1 then echo usage date sh HHMMSS for example date 01 01 01 else echo 1 date s 1 hwclock w hwclock r fi
  • SSH正向连接和反向连接

    ssh命令是openssh套件中的客户端连接工具 可以给予ssh加密协议实现安全的远程登录服务器 反向连接是什么 平时大多数使用ssh命令是控制端主机主动连接受控端主机 通过这个连接控制端主机可以主动的向受控端主机发送一些请求 这称为正向连
  • 如何使用 Pylint 来规范 Python 代码风格

    本文转载至 http www ibm com developerworks cn linux l cn pylint Pylint 是什么 Pylint 是一个 Python 代码分析工具 它分析 Python 代码中的错误 查找不符合代码
  • python pymysql emoji表情插入mysql数据库异常记录报错 pymysql.err.InternalError

    在数据库存储微信小程序用户昵称时候 发现用户昵称使用emoji表情时候就存不了数据库中间报错 pymysql err InternalError 1366 Incorrect string value xF0 x9F x98 x81 xF0
  • STM32F429串口1配置

    static void ConfigUART u32 bound GPIO InitTypeDef GPIO InitStructure GPIO InitStructure用于存放GPIO的参数 USART InitTypeDef USA
  • gethostbyname() -- 用域名或主机名获取IP地址

    http hi baidu com zengzhaonong item 87d9d296d0824cbb82d29570 include
  • leetcode236—二叉树的最近公共祖先(递归/深搜/理解)

    给定一个二叉树 找到该树中两个指定节点的最近公共祖先 百度百科中 最近公共祖先的定义为 对于有根树 T 的两个节点 p q 最近公共祖先表示为一个节点 x 满足 x 是 p q 的祖先且 x 的深度尽可能大 一个节点也可以是它自己的祖先 深
  • 解决CSS引用字体跨域问题

    最近一个需求客户要求换字体需要引入字体 开始没有注意 后来发现会出现跨越现象 特别是在手机上很明显 通过解决尝试终于解决 希望可以帮到大家 1 解决方案就是将文字设置为 base64 编码 字体转base64编码网址 点击进去 下载文件解压
  • oracle wait class user i/o,[ORACLE]管理方面的脚本收集

    1 查询AWR相关的视图名称 SELECT table name FROM dba tables t WHERE table name LIKE WRH AND NOT EXISTS SELECT x FROM dba tab column
  • 英文键盘盲打最快速练习口诀和方法

    下面我提供几种在新建的文档 如用于处理文字的word 里进行英文盲打的练习参考资料 以一天练习四个字母计算 最多7天你的盲打就基本练习成功了 下面的口诀 能帮助你快速记住键盘字母的排列顺序 爱上一个不爱回家的人 七 q 碗 w n 鹅 肉
  • Map遍历取值的五种方式

    方法1 Set set map keySet for Object o set System out println o map get o 方法2 Set set map keySet Iterator iterator set iter
  • 准备WebUI自动化测试面试?这30个问题你必须掌握(二)

    本文共有11000字 包含了后十五个问题 如需要前十五个问题 可查看文末链接 16 在WebUI自动化测试中 你如何处理验证码或图像识别的问题 1 人工识别 一种简单但费时费力的方法是使用人工手动识别验证码 测试人员可以手动输入验证码 将其
  • IntelliJ IDEA中谷歌打开页面,出现windows 找不到文件chrome

    1 右击桌面上的chrome浏览器图标 找到属性 gt 快捷方式 gt 目标 复制路径 即chrome浏览器 exe文件的路径 2 打开IntelliJ IDEA软件 找到file gt settings gt 找到Web Browsers
  • Java实现国密算法SM2,SM3,SM4,并且实现ECB和CBC模式

    代码中实现了电码本ECB模式和密文分组连接CBC模式 SM3 java和SM4 java为算法实现类 utils的都是根据实现类写的工具 可以根据需要调用杂凑算法SM3的杂凑功能获得杂凑值 SM4 java中 sm4 crypt ecb S