java实现Blowfish算法加密解密
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算法加密解密相关推荐
- java和c 的rsa加密算法_RSA算法签名技术Java与C++统一(加密解密结果一样)
RSA算法签名技术Java与C++统一 (加密解密结果一样) 源代码下载地址:http://www.doczj.com/doc/64f44a94a0116c175f0e484d.html/produc ...
- Java简单实现DES加密解密算法
Java简单实现DES加密解密算法 文章目录 Java简单实现DES加密解密算法 DES算法介绍 实现相关java类 代码实现 DES算法介绍 DEC加密算法属于对称加密,即利用指定的密钥,按照密码的 ...
- java之php、Android、JAVA、C# 3DES加密解密
异常如下 1.javax.crypto.BadPaddingException: Given final block not properly padded 1)要确认下是否加密和解密都是使用相同的填 ...
- C# Java间进行RSA加密解密交互
C# Java间进行RSA加密解密交互 原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益, ...
- Go Nodejs Java Aes 128 ECB加密解密结果保持一致
在多语言的生产环境下,常常是由一种语言进行加密而由另一种语言来进行解密,因此有必要保持各种语言之间加密解密算法的一致性.下面列出了Go,Nodejs,Java 的 Aes-128-Ecb的加密解密算法 ...
- C# Java间进行RSA加密解密交互(二)
接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题. 在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与项目中要求的有所出入.在项目中,客户端(Java)的 ...
- C# 对称算法,加密解密类
C# 对称算法,加密解密类 调用有先获取类实例,提供了解密和加密函数. using System.IO; using System; using System.Text.RegularExpres ...
- [转]JAVA与.NET DES加密解密
[转]原文地址:http://www.cnblogs.com/prince3245/archive/2010/03/23/1692630.html JAVA与.NET DES加密解密 前几天做了个项目 ...
- Base-N 算法加密解密实现:
目录 Base-N 算法加密解密实现: Base64 加密解密:(C 语言.python) Base32 加密解密:(C 语言) Base-N 算法加密解密实现: Base64 加密解密:(C 语言. ...
- RSA算法加密解密举例
RSA算法加密解密举例 使用如下数字字母对照表: 明文M="its all greek to me" ,p=47,q=59,e=17,求出其密文以及给出RSA 算法加/解密过程.( ...
最新文章
- 融云任杰:强互动,RTC 下一个“爆点”场景 | 拟合
- zipimport.ZipImportError: can't decompress data; zlib not available
- WB实验关键点!附详细实验检查清单
- boost::multiprecision模块debug_adaptor相关的测试程序
- 转:运维监控系统-监控项及指标的梳理
- apache1.3 php编译,安装Apache1.3.29 - Linux+Apache+Mysql+PHP典型配置详解_Linux教程_Linux公社-Linux系统门户网站...
- UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x80 in position 14: illegal multibyte sequence
- MongoDB的使用
- ajax 调用asp.net后台方法
- JavaScript基础学习笔记
- 庐陵文化(作者:王剑冰,河南省作协副主席)
- 备受关注的个税法进行第七次大型结构调整,你受益有多少?
- 软件企业税收优惠政策
- 链接中的utm_source、utm_campaign、utm_campaign、utm_content、utm_term的含义【转】
- 牛客网在线判题系统JavaScript(V8)使用,附美团赛码系统判题系统使用
- maven snapshot和release版本的区别
- 为什么默认排除 junit-vintage-engine ?
- puppeteer开发中Evaluation failed: ReferenceError: __awaiter is not defined 报错处理
- 如何选择终端桌面管理软件?
- python3.7安装dlib库,无须安装vs
热门文章
- CSS技能点--带图标的标题栏
- VMware安装Linux教程
- Unity入门 简单的3D场景制作
- KafKa 启动异常 : ERROR Failed to clean up log for __consumer_offsets-30 in dir 另一个程序正在使用此文件,进程无法访问
- 大话设计模式之爱你一万年:第三章 创建型模式:工厂模式:我想让你坐在宝马里笑:6.工厂模式在Spring框架和JDK源码中的应用
- java 中关于字节数的总结_javaweb实习报告
- 在VS中如何生成moc文件
- win10玩我的世界java_我的世界win10java下载
- Flink Web UI不能访问
- 什么是Google AMP