java实现Blowfish算法加密解密

BlowFish加密算法是一种对称的分组加密算法,每次加密一个64位分组,使用32位~448位的可变长度密钥,应用于内部加密。

一 Blowfish/ECB/NoPadding

1.前言

  • java中Blowfish/ECB/NoPadding加密时,传入的字符串大小不是8个字节的倍数时,会报异常:
javax.crypto.IllegalBlockSizeException: Input length not multiple of 8 bytes
  • 发生此异常的原因也很明显,就是字符串长度不是 8 字节的倍数,但是java默认不会自动填充,并且java默认不支持zeropadding,即默认不填充0,所以会直接抛出上述异常。
  • 按照这个思路,那么进行填充字节,使字节达到8字节的倍数就可以了,那么我们就实现填充0,即实现zeropadding

2. 代码


import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;/*** Blowfish/ECB/NoPadding 工具*/
public class BlowfishECBNoPaddingUtil {public static void main(String[] ags) {String data = "90QQHWHSGABXSHWDYD";System.out.println("原始字符串:" + data);//加密String encrypt = encodingToBase64("weqweqwMMA", data);System.out.println("加密结果:" + encrypt);//解密String decodingByBase64 = decodingByBase64("weqweqwMMA", encrypt);System.out.println("解密结果:" + decodingByBase64);System.out.println("是否完全相等:" + data.equals(decodingByBase64));}/*** Blowfish/ECB/NoPadding 加密并输出base64* 不足8倍数自动尾部补充0** @param key  密钥key* @param data 要加密的字符串* @return 加密后的字符串*/public static String encodingToBase64(String key, String data) {try {Cipher cipher = Cipher.getInstance("Blowfish/ECB/NoPadding");int blockSize = cipher.getBlockSize();byte[] dataBytes = data.getBytes();int length = dataBytes.length;//计算需填充长度if (length % blockSize != 0) {length = length + (blockSize - (length % blockSize));}byte[] plaintext = new byte[length];//填充System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "Blowfish");cipher.init(Cipher.ENCRYPT_MODE, keySpec);return java.util.Base64.getEncoder().encodeToString(cipher.doFinal(plaintext));} catch (Exception e) {e.printStackTrace();return null;}}/*** Blowfish/ECB/NoPadding 解密base64的字符串* 自动去除尾部补充的0** @param key 密钥key* @param str 要解密的字符串* @return 解密后的字符串*/public static String decodingByBase64(String key, String str) {SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "Blowfish");Cipher cipher;String cipherInstName = "Blowfish/ECB/NoPadding";byte[] doFinal;try {cipher = Cipher.getInstance(cipherInstName);cipher.init(Cipher.DECRYPT_MODE, skeySpec);doFinal = cipher.doFinal(java.util.Base64.getDecoder().decode(str.getBytes()));} catch (Exception e) {e.printStackTrace();return null;}int zeroIndex = doFinal.length;for (int i = doFinal.length - 1; i > 0; i--) {if (doFinal[i] == (byte) 0) {zeroIndex = i;} else {break;}}// 删除末尾填充的0doFinal = Arrays.copyOf(doFinal, zeroIndex);return new String(doFinal, StandardCharsets.UTF_8);}
}

二 待续

java实现Blowfish算法加密解密相关推荐

  1. java和c 的rsa加密算法_RSA算法签名技术Java与C++统一(加密解密结果一样)

    RSA算法签名技术Java与C++统一 (加密解密结果一样) 源代码下载地址:http://www.doczj.com/doc/64f44a94a0116c175f0e484d.html/produc ...

  2. Java简单实现DES加密解密算法

    Java简单实现DES加密解密算法 文章目录 Java简单实现DES加密解密算法 DES算法介绍 实现相关java类 代码实现 DES算法介绍 DEC加密算法属于对称加密,即利用指定的密钥,按照密码的 ...

  3. java之php、Android、JAVA、C# 3DES加密解密

    异常如下 1.javax.crypto.BadPaddingException: Given final block not properly padded 1)要确认下是否加密和解密都是使用相同的填 ...

  4. C# Java间进行RSA加密解密交互

    C# Java间进行RSA加密解密交互 原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益, ...

  5. Go Nodejs Java Aes 128 ECB加密解密结果保持一致

    在多语言的生产环境下,常常是由一种语言进行加密而由另一种语言来进行解密,因此有必要保持各种语言之间加密解密算法的一致性.下面列出了Go,Nodejs,Java 的 Aes-128-Ecb的加密解密算法 ...

  6. C# Java间进行RSA加密解密交互(二)

    接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题. 在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与项目中要求的有所出入.在项目中,客户端(Java)的 ...

  7. C# 对称算法,加密解密类

    C# 对称算法,加密解密类 调用有先获取类实例,提供了解密和加密函数. using System.IO;  using System;  using System.Text.RegularExpres ...

  8. [转]JAVA与.NET DES加密解密

    [转]原文地址:http://www.cnblogs.com/prince3245/archive/2010/03/23/1692630.html JAVA与.NET DES加密解密 前几天做了个项目 ...

  9. Base-N 算法加密解密实现:

    目录 Base-N 算法加密解密实现: Base64 加密解密:(C 语言.python) Base32 加密解密:(C 语言) Base-N 算法加密解密实现: Base64 加密解密:(C 语言. ...

  10. RSA算法加密解密举例

    RSA算法加密解密举例 使用如下数字字母对照表: 明文M="its all greek to me" ,p=47,q=59,e=17,求出其密文以及给出RSA 算法加/解密过程.( ...

最新文章

  1. 融云任杰:强互动,RTC 下一个“爆点”场景 | 拟合
  2. zipimport.ZipImportError: can't decompress data; zlib not available
  3. WB实验关键点!附详细实验检查清单
  4. boost::multiprecision模块debug_adaptor相关的测试程序
  5. 转:运维监控系统-监控项及指标的梳理
  6. apache1.3 php编译,安装Apache1.3.29 - Linux+Apache+Mysql+PHP典型配置详解_Linux教程_Linux公社-Linux系统门户网站...
  7. UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x80 in position 14: illegal multibyte sequence
  8. MongoDB的使用
  9. ajax 调用asp.net后台方法
  10. JavaScript基础学习笔记
  11. 庐陵文化(作者:王剑冰,河南省作协副主席)
  12. 备受关注的个税法进行第七次大型结构调整,你受益有多少?
  13. 软件企业税收优惠政策
  14. 链接中的utm_source、utm_campaign、utm_campaign、utm_content、utm_term的含义【转】
  15. 牛客网在线判题系统JavaScript(V8)使用,附美团赛码系统判题系统使用
  16. maven snapshot和release版本的区别
  17. 为什么默认排除 junit-vintage-engine ?
  18. puppeteer开发中Evaluation failed: ReferenceError: __awaiter is not defined 报错处理
  19. 如何选择终端桌面管理软件?
  20. python3.7安装dlib库,无须安装vs

热门文章

  1. CSS技能点--带图标的标题栏
  2. VMware安装Linux教程
  3. Unity入门 简单的3D场景制作
  4. KafKa 启动异常 : ERROR Failed to clean up log for __consumer_offsets-30 in dir 另一个程序正在使用此文件,进程无法访问
  5. 大话设计模式之爱你一万年:第三章 创建型模式:工厂模式:我想让你坐在宝马里笑:6.工厂模式在Spring框架和JDK源码中的应用
  6. java 中关于字节数的总结_javaweb实习报告
  7. 在VS中如何生成moc文件
  8. win10玩我的世界java_我的世界win10java下载
  9. Flink Web UI不能访问
  10. 什么是Google AMP