打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
AzDGCrypt可逆加密算法的java实现_Shell.C {Nobody‘s Home...

AzDGCrypt可逆加密算法的java实现

April 26, 2006 8:52:28 PM CST Post by : Shell.C

March 12, 2006 4:29:04 PM CST Post by : Shell.C
AzDGCrypt是Azerbaijan Development Group(AzDG)开发的可逆加密算法。最近在研究Discuz4.1.0提供的passport功能。其中用到了AzDGCrypt加解密方法。顺手把他翻译成了java版的。代码中用到了MD5和Base64两个类,这两个算法可以在网上找到相应的java实现。只要稍做修改就可以,所有没有给出代码。

因为我用的discuz是gb2312的码,而java那边用的是utf-8,所有为了解决编码问题,这段代码也给出了一个可选择编码方式的实现。

/**
* AzDGCrypt.java
*
* 2006-03-08
*
*/
package cn.vap.lib;

import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;

/**
* The AzDGCrypt
*
* @author Shell.C
*
*/
public class AzDGCrypt {

/**
* encrypt
*
* @param txt
* @param key
* @return
*/
public static byte[] encrypt(byte[] txt, byte[] key) {
int rand = new Double(Math.random()*32000).intValue();

byte[] encrypt_key = new MD5().getMD5ofStr(rand+"").toLowerCase().getBytes();

byte ctr = 0;

ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
for (int i = 0, j = 0; i < txt.length; i++,j+=2) {
ctr = ctr == encrypt_key.length ? 0 : ctr;
byteOut.write(encrypt_key[ctr]);
byteOut.write(txt[i] ^ encrypt_key[ctr++]);
}

return Base64.encodeBytes(encodeKey(byteOut.toByteArray(), key)).getBytes();
}

public static String encrypt(String txt,String key){
return new String(encrypt(txt.getBytes(),key.getBytes()));
}

public static String encrypt(String txt,String key,String encoding){
String str = null;
try{
str = new String(encrypt(txt.getBytes(encoding),key.getBytes()));
}catch(UnsupportedEncodingException e){
e.printStackTrace();
}
return str;
}


/**
* decrypt
*
* @param txt
* @param key
* @return
*/
public static byte[] decrypt(byte[] txt, byte[] key) {
txt = encodeKey(Base64.decode(txt, 0, txt.length), key);

ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
for (int i = 0; i < txt.length; i++) {
byte md5 = txt[i];
byteOut.write(txt[++i] ^ md5);
}
return byteOut.toByteArray();
}

/**
*
* @param txt
* @param key
* @return
*/
public static String decrypt(String txt, String key){
return new String(decrypt(txt.getBytes(),key.getBytes()));
}

/**
*
* @param txt
* @param key
* @return
*/
public static byte[] encodeKey(byte[] txt, byte[] encrypt_key) {

encrypt_key = new MD5().getMD5ofStr(new String(encrypt_key))
.toLowerCase().getBytes();

byte ctr = 0;
byte[] tmp = new byte[txt.length];
//ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
for (int i = 0; i < txt.length; i++) {
ctr = ctr == encrypt_key.length ? 0 : ctr;
tmp[i] = (byte) (txt[i] ^ encrypt_key[ctr++]);
//byteOut.write(txt[i] ^ encrypt_key[ctr++]);
}
return tmp;
}

public static void main(String[] arg) {
String source = "Hello, World!中文";
String key = "1221";

System.out.println("Source : " + source + " Key : " + key);
String encryptTxt = AzDGCrypt.encrypt(source, key,"gbk");
System.out.println("Encypt String : " + encryptTxt);
String decryptTxt = AzDGCrypt.decrypt(encryptTxt, key);
System.out.println("Decypt String : " + decryptTxt);
}
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
PHP令牌 Token改进版
AES加密代码 【重要】
加密抛异常:javax.crypto.BadPaddingException: Given final block not properly padded
.NET中的加密算法总结
C# 加解密之RSA
常用加密算法的Java实现总结(二)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服