前言
我们网络信息安全的实验。。。要我们找各种算法源代码,其实这倒不是很难,就是有点费时间。我综合了网上找到的代码,用Java自制了一个密码学工具。里面包含了对称加密算法 DES,AES,IDEA,公开加密算法 RSA,ECC,散列算法 MD5,SHA1,CRC32,以及 RSA,DSA,ECDSA 实现数字签名验证示例。
所有加密算法都是我辛辛苦苦找的可以运行的。。然后修改了调用接口,最后用 Base64编码 将结果展示为 String 字符串,我可以保证每个算法都可以正确的加密解密,但是不能保证算法本身的正确性。
由于只是一个实验用的小工具,所以很多异常和不人性化的地方没有处理。我觉得这工具本身价值不是很大,但是找能运行的开源密码学算法真的脑壳疼,这里集成了上面提到的所有算法源码(下面有项目结构),有需要可以自取。
git网址
https://github.com/szluyu99/Encryption-And-Decryption-By-Yu
项目结构
项目预览
这个是俺之前看到的一个小demo,感觉很骚气,就拿来当主界面骚一下。
点击打乱~
对称加密中,DES、DES2表示DES算法的两种实现源码,AES、IDEA同理。
公开加密里,RSA、RSA2表示RSA的两种源码实现。ECC同理,不过ECC3好像忘了做了,不管了。
散列算法里包含了MD5,SHA1,CRC32。withSalt
表示加盐。
数字签名暂时还没放到图形化界面上,但是项目里包含了可以运行的demo。
破解散列表的话,后来采用了 rainbowcrack 和 MD5Crack3.0,UltraCrackingMachine 等几个现成的软件,很好用,就没有放上去了。。
以后有机会把这个软件做完。(好像每个软件我都是这么想的)
下面补充一下 String 与 byte[] 互转的笔记。
String与byte[]互转
通过用例学习Java中的byte数组和String互相转换,这种转换可能在很多情况需要,比如IO操作,生成加密hash码等等。
一般除非特殊需求,否则不要将它们互相转换,他们分别代表了不同的数据,专门服务于不同的目的,通常String
代表文本字符串,byte[]
针对二进制数据。
这两天在做网络安全的密码学实验,自己写了一个小工具,集成网上找到的对称加密,公开加密,散列算法等。但是网上很多算法是通过byte[]
进行编码与解码,对于我们来说不方便展示,因此可以通过 Base64 转成字符串来展示。
通过String
类转换
用String.getBytes()方法将字符串转换为byte数组,通过String构造函数将byte数组转换成String
注意:这种方式使用平台默认字符集
public class StringByteArrayExamples
{
public static void main(String[] args)
{
// String
String string = "hello world";
// String 转 byte[]
byte[] bytes = string.getBytes();
// byte[] 转 String
String s = new String(bytes);
System.out.println("Decoded String : " + s);
}
}
hello world
通过Base64
互转[jdk-8]
Base64
是一种将二进制数据编码的方式,正如UTF-8
和UTF-16
是将文本数据编码的方式一样,所以如果你需要将二进制数据编码为文本数据,那么Base64
可以实现这样的需求。
从 Java 8 开始可以使用Base64
这个类。
import java.util.Base64;
public class StringByteArrayExamples
{
public static void main(String[] args)
{
// byte[]
byte[] bytes = "hello world".getBytes();
// byte[] 转 String
String encoded = Base64.getEncoder().encodeToString(bytes);
// String 转 byte[]
byte[] decoded = Base64.getDecoder().decode(encoded);
System.out.println( new String(decoded) );
}
}
hello world