范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

编程中常用的加密算法

  概述
  编程中常见的加密算法有以下几种,它们在不同场景中分别有应用。除信息摘要算法外,其它加密方式都会需要密钥。 信息摘要算法 对称加密算法 非对称加密算法 密钥
  密钥 (key,又常称 金钥 )是指某个用来完成 加密 、 解密 、 完整性验证 等密码学应用的秘密信息。 密钥分类加解密中的密钥:对称加密中共享相同的密钥,非对称加密中分 公钥 和 私钥 ,公钥加密私钥解密。 消息认证码和数字签名中的密钥:在消息认证码中,消息发送方和接收方使用共享密钥进行认证。在数字签名中,签名使用私钥,而验证使用公钥。 会话密钥和主密钥:每次通信只使用一次的密钥称为会话密钥(session key)。相对于会话密钥,重复使用的密钥称为主密钥(master key)。 密钥和密码
  密码一般是由用户生成,具有可读性,可以记忆和存储,常用于软件管理,而密钥是供实现加密算法的软件使用,不需要具备可读性(不过在编程中为了方便阅读都进行Base64)。我们也可以通过密码来生成密钥。 密钥管理生成密钥:可以用随机数生成密钥,也可以用口令生成密钥。 配送密钥:可采用事先共享密钥、使用密钥分配中心、使用公钥密码、使用Diffie-Hellman密钥交换。 更新密钥 保存密钥 作废密钥 密钥生成
  jdk 中 jce (Java Cryptography Extension) 包含了加密相关的所有API。
  生成对称加密算法的密钥
  public static SecretKey generateKey(int keySize) {         KeyGenerator keyGenerator;         try {             keyGenerator = KeyGenerator.getInstance("AES");             keyGenerator.init(keySize);             return keyGenerator.generateKey();         } catch (NoSuchAlgorithmException e) {             // ignore             return null;         }     }
  生成对称非对称加密算法的密钥     /**      * 生成非对称密钥对      *      * @param keySize 密钥大小      * @param random  指定随机来源,默认使用 JCAUtil.getSecureRandom()      * @return 非对称密钥对      * @throws NoSuchAlgorithmException NoSuchAlgorithm      */     public static PPKeys genKeysRSA(int keySize, SecureRandom random) throws NoSuchAlgorithmException {         KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");         if (null != random) {             generator.initialize(keySize, random);         } else {             generator.initialize(keySize);         }         KeyPair pair = generator.generateKeyPair();         PPKeys keys = new PPKeys();         PublicKey publicKey = pair.getPublic();         PrivateKey privateKey = pair.getPrivate();         keys.setPublicKey(Base64.getEncoder().encodeToString(publicKey.getEncoded()));       keys.setPrivateKey(Base64.getEncoder().encodeToString(privateKey.getEncoded()));         return keys;     }
  密钥协商 ( Diffie-Hellman )
  密钥协商是一种协议,两方或多方在通过该协议建立相同的共享密钥,然后通讯内容进行对称加密传输,而不需要交换密钥。
  大致过程:每一方生成一个公私钥对并将公钥分发给其它方,当都获得其他方的公钥副本后就可以离线计算共享密钥。
  Java中提供了  KeyAgreement   可以实现密钥协商。
  Alice 和 Bob 分别用他们的私钥初始化自己的密钥协商对象  KeyAgreement   ,调用init()   方法;然后将通信的每一方的公钥 传入执行  doPhase(Key key, boolean lastPhase)   ;各方生成共享密钥  generateSecret()  。    public static void diffieHellman() throws Exception {         AlgorithmParameterGenerator dhParams = AlgorithmParameterGenerator.getInstance("DH");         dhParams.init(1024);         KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH");         keyGen.initialize(dhParams.generateParameters().getParameterSpec(DHParameterSpec.class), new SecureRandom());          KeyAgreement aliceKeyAgree = KeyAgreement.getInstance("DH");         KeyPair alicePair = keyGen.generateKeyPair();         KeyAgreement bobKeyAgree = KeyAgreement.getInstance("DH");         KeyPair bobPair = keyGen.generateKeyPair();          aliceKeyAgree.init(alicePair.getPrivate());         bobKeyAgree.init(bobPair.getPrivate());          aliceKeyAgree.doPhase(bobPair.getPublic(), true);         bobKeyAgree.doPhase(alicePair.getPublic(), true);         boolean agree = Base64.getEncoder().encodeToString(aliceKeyAgree.generateSecret()).equals(           Base64.getEncoder().encodeToString(bobKeyAgree.generateSecret())         );         System.out.println(agree);     } 信息摘要算法
  信息摘要算法又叫 加密散列算法 ,加密过程不需要密钥,常见的加密散列算法有 MD系列 和 SHA系列 。
  一个理想的加密散列函数应该具备以下特性: 任何信息传入后,输出的总是长度固定; 消息摘要看起来是"随机的",这样根据原始信息就很难推测出值; 好的散列函数碰撞概率应该极低,也就是不同信息传入后得到相同值的概率; MD系列
  MD5信息摘要算法 (MD5 Message-Digest Algorithm),一种被广泛使用的加密散列函数,输出出一个128位(16字节)的散列值(hash value),MD5最初设计为加密散列函数,而目前发现它存在大量漏洞,所以不建议直接用作加密,不过在非加密场景下如:数据完整性校验,文件完整性校验它仍然有广泛的应用。     public static String md5(String content) {         try {             MessageDigest digest = MessageDigest.getInstance("MD5");             byte[] bytes = digest.digest(content.getBytes(StandardCharsets.UTF_8));             return Hex.encodeHexString(bytes);         } catch (final NoSuchAlgorithmException e) {             throw new IllegalArgumentException(e);         }     } SHA系列
  安全散列算法 (Secure Hash Algorithm,缩写为SHA)是一个加密散列函数家族,是FIPS(美国联邦信息处理标准)所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
  它们分别包含  SHA-0、SHA-1、SHA-2、SHA-3  ,其中 SHA-0、SHA-1   输出长度是160位,SHA-2   包含 SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256  ,我们平时常用 SHA-256   。    public static String sha256(String content) {         try {             MessageDigest digest = MessageDigest.getInstance("SHA-256);             byte[] bytes = digest.digest(content.getBytes(StandardCharsets.UTF_8));             return Hex.encodeHexString(bytes);         } catch (final NoSuchAlgorithmException e) {             throw new IllegalArgumentException(e);         }     } 对称加密算法
  对称加密算法,双方持有相同密钥进行加解密,常见的对称加密算法: DES   3DES   AES128   AES192   AES256  。理解对称加密需要先明白下面几个概念:分组密码模式 :将明文切割进行加密,再将密文拼接到一起。比如AES中会将明文数据切割为大小16字节的数据块,最后一块不够16字节时,使用Padding模式进行补充。 填充(Padding) :它有三种模式PKCS5、PKCS7和NOPADDING,PKCS5用缺少的字节数来填充,比如缺少5个字节就填充5个数字5,PKCS7缺少的字节数用0来填充。如果数据刚好是16的整数倍,PKCS5和PKCS7会再补充一个16字节数据来区分填充和有效数据,NOPADDING模式不需要填充。 初始化向量 :初始向量IV的作用是使加密更加安全可靠,在分组密码模式下IV大小对应数据块长度。 加密模式 :四种加密模式分别是:ECB(电子密码本模式)、CBC(密码分组链接模式)、CFB、OFB。ECB模式是仅仅使用明文和密钥来加密数据,所以该模式下不需要Padding,安全性也较弱,CBC模式数据分块并且使用传入IV依次进行异或操作,安全性也相对较高,所以目前一般都选择CBC模式。 加密密钥 :不同加密算法密钥长度不同,比如:DES 默认长度56位,3DES默认长度168位,也支持128位,AES默认128位,也支持192位,256位。我们一般根据密码生成密钥,密码长度需要满足算法密钥长度。 DES
  DES   是对称加密算法领域中的典型算法,因为密钥默认长度为56 bit  ,所以密码长度需要大于 8 byte  ,DESKeySpec   取前 8 byte   进行密钥制作。 public static String encryptDES(byte[] content, String password) {         try {             SecureRandom random = new SecureRandom();             DESKeySpec desKeySpec = new DESKeySpec(password.getBytes());             SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");             SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec);             Cipher cipher = Cipher.getInstance("DES");             cipher.init(Cipher.ENCRYPT_MODE, secretKey, random);             return Base64.getEncoder().encodeToString(cipher.doFinal(content));         } catch (Exception e) {             throw new RuntimeException(e);         }     }      public static String decryptDES(String content, String password) throws Exception {         SecureRandom random = new SecureRandom();         DESKeySpec desKeySpec = new DESKeySpec(password.getBytes());         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");         SecretKey secretKey = keyFactory.generateSecret(desKeySpec);         Cipher cipher = Cipher.getInstance("DES");         cipher.init(Cipher.DECRYPT_MODE, secretKey, random);         return new String(cipher.doFinal(Base64.getDecoder().decode(content)));     } 3DES
  3DES(即Triple DES)。是DES算法的加强,它使用3条56位的密钥对数据进行三次加密。它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES,3DES更为安全。密钥默认长度  168 bit  , 密码需要大于24 byte  ,IV 是 8 byte   的随机数字和字母数组。     public static String encrypt3DESECB(String content, String key, String iv) {         try {             IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));             DESedeKeySpec dks = new DESedeKeySpec(key.getBytes(StandardCharsets.UTF_8));             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");             SecretKey secretkey = keyFactory.generateSecret(dks);             Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");             cipher.init(Cipher.ENCRYPT_MODE, secretkey, ivSpec);             return Base64.getEncoder().encodeToString(cipher.doFinal(content.getBytes(StandardCharsets.UTF_8)));         } catch (Exception e) {             throw new RuntimeException(e);         }     }      public static String decrypt3DESECB(String content, String key, String iv) {         try {             IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));             DESedeKeySpec dks = new DESedeKeySpec(key.getBytes(StandardCharsets.UTF_8));             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");             SecretKey secretkey = keyFactory.generateSecret(dks);             Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");             cipher.init(Cipher.DECRYPT_MODE, secretkey, ivSpec);             return new String(cipher.doFinal(Base64.getDecoder().decode(content)), StandardCharsets.UTF_8);         } catch (Exception e) {             throw new RuntimeException(e);         }     }  AES
  AES 高级数据加密标准,能够有效抵御已知的针对DES算法的所有攻击,默认密钥长度为 128 bit  ,还可以供选择 192 bit  ,256 bit  。AES-128   AES-192   AES-256
  默认  AES-128   ,使用 PBEKeySpec   生成固定大小的密钥。public static String encryptAES128(String plainText, String password, String salt) throws Exception {         SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");         byte[] saltBytes = salt.getBytes(StandardCharsets.UTF_8);         // AES-128 密钥长度为128bit         PBEKeySpec spec = new PBEKeySpec(           password.toCharArray(),           saltBytes,           1000,           128         );         SecretKey secretKey = factory.generateSecret(spec);         SecretKeySpec secret = new SecretKeySpec(secretKey.getEncoded(), "AES");         Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");         AlgorithmParameters params = cipher.getParameters();         IvParameterSpec iv = params.getParameterSpec(IvParameterSpec.class);          cipher.init(Cipher.ENCRYPT_MODE, secret, iv);         byte[] encryptedTextBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));          String encodedText = Base64.getEncoder().encodeToString(encryptedTextBytes);         String encodedIV = Base64.getEncoder().encodeToString(iv.getIV());         String encodedSalt = Base64.getEncoder().encodeToString(saltBytes);         return encodedSalt + "." + encodedIV + "." + encodedText;     }       public static String decryptAES128(String encryptedText, String password) throws Exception {         String[] fields = encryptedText.split(".");         byte[] saltBytes = Base64.getDecoder().decode(fields[0]);         byte[] ivBytes = Base64.getDecoder().decode(fields[1]);         byte[] encryptedTextBytes = Base64.getDecoder().decode(fields[2]);          SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");         PBEKeySpec spec = new PBEKeySpec(           password.toCharArray(),           saltBytes,           1000,           128         );          SecretKey secretKey = factory.generateSecret(spec);         SecretKeySpec secret = new SecretKeySpec(secretKey.getEncoded(), "AES");         Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");         cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(ivBytes));         byte[] decryptedTextBytes;         try {             decryptedTextBytes = cipher.doFinal(encryptedTextBytes);             return new String(decryptedTextBytes);         } catch (IllegalBlockSizeException | BadPaddingException e) {             throw new RuntimeException(e);         }     }
  使用  AES-256   时可能会出现下面异常: java.security.InvalidKeyException: Illegal key size
  JDK 1.8.0_161 及以上版本默认已经启用无限强度加密:     static {         java.security.Security.setProperty("crypto.policy", "unlimited");     }
  JDK 1.8.0_161以前版本需要手动安装 jce  策略文件 (下载地址) 非对称加密算法
  非对称加密使用一对密钥,公钥用作加密,私钥则用作解密。关于密钥大小,截至2020年,公开已知的最大RSA密钥是破解的是829位的RSA-250,建议至少使用 2048 位密钥。
  public static String encrypt(byte[] publicKey, String plainText) {         X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);         KeyFactory kf;         try {             kf = KeyFactory.getInstance("RSA");             PublicKey publicKeySecret = kf.generatePublic(keySpec);             Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");             cipher.init(Cipher.ENCRYPT_MODE, publicKeySecret);             byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());             return new String(Base64.getEncoder().encode(encryptedBytes));         } catch (Exception e) {             log.error("Rsa encrypt error ", e);             throw new RuntimeException(e);         }     }  	public static String decrypt(byte[] privateKey, String encryptedText) {         PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey);         KeyFactory kf;         try {             kf = KeyFactory.getInstance("RSA");             PrivateKey privateKeySecret = kf.generatePrivate(keySpec);             Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");             cipher.init(Cipher.DECRYPT_MODE, privateKeySecret);             return new String(cipher.doFinal(Base64.getDecoder().decode(encryptedText)), StandardCharsets.UTF_8);         } catch (Exception e) {             log.error("Rsa decrypt error ", e);             throw new RuntimeException(e);         }     }
  文章来自https://www.cnblogs.com/sky233/p/16096053.html

精巧掌心设计,感受三星GalaxyZFlip35G不一样的美三星一直致力于通过技术和产品创新满足不同用户的需求,相对于拥有横向折叠大屏的三星GalaxyZFold系列,纵向折叠设计的三星GalaxyZFlip系列则更满足那些喜爱小巧便携手机宏碁公布适配Win11电脑清单含暗影骑士蜂鸟等系列根据用户顽果度投稿,Acer宏碁官网本周出现了介绍微软Windows11操作系统的页面,对将于10月发布的新系统进行预热,同时,宏碁公布了当Win11推出时,可免费升级的电脑清单,脑洞大开!OPPO新机设计引热议,侧边摄像头可还行?当下我们所熟知的手机拍摄方式无非就是两种,前置拍摄和后置拍摄。但OPPO这次却把手机摄像玩出了新花样,其带来了侧边拍摄模块。据LetsGodigital消息,OPPO申请了一项新专aigo国民好物扩展坞H4上手体验桌面扩展的多功能神器我们见过上千元的扩展坞,也见过上百的元多功能连接设备。但你见过不到50元的扩展坞吗?看到这或许你们心里会直接冒出一句话,那就是便宜没好货好货不便宜。难道在目前的市场中就真如是如此吗KlipschTheFives音箱体验什么都能连,提升桌面幸福感的工具音频无线化,可算是讲了好几年的新趋势。趋势影响的不仅仅是移动音频,家用领域也有越来越多的产品加入无线化的大家庭里面。在这里,以SoundBar为首的家庭影音系统就推进得非常快。So阿里女员工案最新进展当事人妻子发声,已正式向警方起诉9月27日晚,微博认证为阿里女员工案的张某妻子尚善如水a11发声,称已正式向公安机关起诉阿里女员工周。张的妻子表示,公安机关已正式受理此案。张的妻子在微博上说,周对阿里制造假新闻大姚安娜和孟晚舟关系好吗?姚安娜和孟晚舟是华为老总任正非的女儿,都随母亲的姓氏。孟晚舟是任正非和第一任妻子所生,在华为担任要职。而姚安娜和孟晚舟是同父异母,对娱乐圈饶有兴趣。孟晚舟和姚安娜的关系好不好,不是让人心烦的支付宝支付宝开始面向市场出现在大众面前的时候,给大家带来了不少方便,随着时间推移,乱七八糟的东西应运而生,推送信息每天不断的骚扰,为什么说它是骚扰呢!其一,信息不是支付方面的信息,也不是以法治促规范,推进互联网持续健康发展当前,世界正进入数字经济快速发展的时期,以互联网为代表的新一代信息通信技术加速突破应用,新一轮科技革命和产业变革突飞猛进,正深刻影响全球科技创新产业结构调整经济社会发展。在中国,中再过多少年,中国会进入获诺贝尔奖的井喷期?请阐述理由?再过一千年,中国也不会进入诺奖获得的井喷期。诺奖的初衷是好的。但被一些西方所谓的政客玩坏了。逢中必反。只要是中国的,即使对人类贡献最大的,到它们眼里也就是一般的,或者是不好的。所有该怎么做好电商?未来电商的趋势在哪里?谢谢悟空小秘书的邀请!我个人认为,未来电商主要有三个发展方向拼多多主导的社交电商,淘宝网红主导的直播电商,以及快手主导的农村电商。这三个领域有交叉,不过本质上又有比较大的区别。请帮
java反射机制首先提一下静态语言,静态语言表示程序的结构在编译的时候就已经确定了,不能够改变,而动态语言相反,即可以改变,比如我可以删除某个函数。java反射机制指的是在运行时可以获取到运行类的华为海思退场,紫光展锐成最大赢家?在全球智能型手机5GSoC(系统单晶片)舞台中,高通联发科华为海思三星电子紫光展锐等业者纷纷成为要角。与其他老大哥相比,过去大家并不太关注紫光展锐,然而紫光展锐是继联发科高通后,第全力释放酷睿i9强大性能,技嘉小雕Z590AORUSPROAX主板评测今年11代酷睿在性能上给我们带来了不少惊喜,除了全新的CypressCove架构带来了高达19的IPC提升之外,同时还为最猛的酷睿i911900K处理器带来了全新的睿频技术Adap小米多看电纸书,电子书一族,首选的设备平时下班之后,回到家,就喜欢窝在客厅看2小时电子书,缓解工作上的疲劳。买过kindle电子书也用手机平板等等电子产品,看电子书,看了没多久,眼睛特别模糊甚至还出现酸痛。对于爱看电子稳先微电池保护芯片获传音TECNOBuds2真无线耳机应用TECNO是传音控股旗下的一个手机品牌,了解海外新兴市场消费者的需求,并为他们提供融入本地化创新的智能机平板及其他智能终端产品,销售网络遍及全球60多个国家和地区。随着TWS真无线AMD游戏本次顶级显卡,RX6700M性能如何?略强于3070,胜在便宜兼容机之家小牛带你发现更多新潮数码资讯。月初的Chinajoy2021展会上AMD推出了自家的游戏本设计框架超威卓越平台,意在构建自己的游戏本生态链,锐龙CPU搭配AMD显卡,一台三星6000mAh新机获认证,骁龙6nm芯片,中端价位三星目前已经展现出不好的状态,主要是因为小米等国产厂商开始大量进军国外市场,与三星在欧洲市场印度市场等地方展开了激烈竞争,而国产手机最明显的就是性价比优势,所以一旦性价比优势在国外阿里一鲸落,中华万物生重新反思广告平台资本收割的模式阿里一鲸落,中华万物生这显然也是中国社会的一个可选项。在考量阿里巴巴这样的巨头对社会的贡献与损害的时候,也是需要重新反思广告平台资本收割的模式。阿里巴巴并非真正的电商,它自己不卖货算法(附思维导图全部解法)300题之(8)字符串转换整数(atoi)零标题算法(leetode,附思维导图全部解法)300题之(8)字符串转换整数(atoi)导读我的解法很多且很sao,你忍一下一题目描述题目描述题目描述题目描述题目描述二解法总览(惠普OMEN暗影精灵7强悍升级高能Buff助力火力全开为了满足玩家的更高要求,惠普OMEN暗影精灵7不光在硬件配置性能释放散热屏幕以及外观等方面都拥有全面进化,事实上惠普游戏控制中心(OMENGamingHub)也有着全新升级,可以激ParallelsDesktop17forMac支持Windows11新的M1功能2021年8月10日,Corel发布了ParallelsDesktop17forMac,这是其虚拟化软件的最新版本。自去年Apple开始将其Mac转换为ARM处理器以来,该平台就获