在下面的代码中,把DSA的公钥和私钥保存在文件中,要使用该代码你需要先得到DSA算法的公钥和私钥才行。其实下面的代码就是JProbe 6.0.2 不完整分析的注册机,本打算在看雪论坛混片精华,分析到后来才发现注册文件在二进制代码中有多处验证,这不是我的强项,再加上年末事情较多,所以只好放弃。
public final class Codecs
{
private Codecs()
{
}
public static final byte[] base64Encode(byte abyte0[])
{
if(abyte0 == null)
return null;
byte abyte1[] = new byte[((abyte0.length + 2) / 3) * 4];
int i = 0;
int j = 0;
for(; i < abyte0.length - 2; i += 3)
{
abyte1[j++] = Base64EncMap[abyte0[i] >>> 2 & 0x3f];
abyte1[j++] = Base64EncMap[abyte0[i + 1] >>> 4 & 0xf | abyte0[i] << 4 & 0x3f];
abyte1[j++] = Base64EncMap[abyte0[i + 2] >>> 6 & 3 | abyte0[i + 1] << 2 & 0x3f];
abyte1[j++] = Base64EncMap[abyte0[i + 2] & 0x3f];
}
if(i < abyte0.length)
{
abyte1[j++] = Base64EncMap[abyte0[i] >>> 2 & 0x3f];
if(i < abyte0.length - 1)
{
abyte1[j++] = Base64EncMap[abyte0[i + 1] >>> 4 & 0xf | abyte0[i] << 4 & 0x3f];
abyte1[j++] = Base64EncMap[abyte0[i + 1] << 2 & 0x3f];
} else
{
abyte1[j++] = Base64EncMap[abyte0[i] << 4 & 0x3f];
}
}
for(; j < abyte1.length; j++)
abyte1[j] = 61;
return abyte1;
}
public static final byte[] base64Decode(byte abyte0[])
{
if(abyte0 == null)
return null;
int i;
for(i = abyte0.length; abyte0[i - 1] == 61; i--);
byte abyte1[] = new byte[i - abyte0.length / 4];
for(int j = 0; j < abyte0.length; j++)
abyte0[j] = Base64DecMap[abyte0[j]];
int k = 0;
int l;
for(l = 0; l < abyte1.length - 2; l += 3)
{
abyte1[l] = (byte)(abyte0[k] << 2 & 0xff | abyte0[k + 1] >>> 4 & 3);
abyte1[l + 1] = (byte)(abyte0[k + 1] << 4 & 0xff | abyte0[k + 2] >>> 2 & 0xf);
abyte1[l + 2] = (byte)(abyte0[k + 2] << 6 & 0xff | abyte0[k + 3] & 0x3f);
k += 4;
}
if(l < abyte1.length)
abyte1[l] = (byte)(abyte0[k] << 2 & 0xff | abyte0[k + 1] >>> 4 & 3);
if(++l < abyte1.length)
abyte1[l] = (byte)(abyte0[k + 1] << 4 & 0xff | abyte0[k + 2] >>> 2 & 0xf);
return abyte1;
}
private static byte Base64EncMap[];
private static byte Base64DecMap[];
static
{
byte abyte0[] = {
65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
85, 86, 87, 88, 89, 90, 97, 98, 99, 100,
101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
121, 122, 48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 43, 47
};
Base64EncMap = abyte0;
Base64DecMap = new byte[128];
for(int i = 0; i < Base64EncMap.length; i++)
Base64DecMap[Base64EncMap[i]] = (byte)i;
}
}
import java.io.UnsupportedEncodingException;
public final class SignableBlock
{
private SignableBlock()
{
}
public static byte[] createSignableBlock(String as[])
throws UnsupportedEncodingException
{
StringBuffer stringbuffer = new StringBuffer(256);
for(int i = 0; i < as.length; i++)
stringbuffer.append(as[i]);
return stringbuffer.toString().getBytes("UTF-8");
}
}
import java.io.UnsupportedEncodingException;
import java.security.*;
final class ValidateSignature
{
private ValidateSignature()
{
}
public static void main(String[] args)
{
String[] as = {"qq:8117892","www.blogjava.net/galaxyp","DSA数字签名"};
String s = "MCwCFFSpNp/n4Mq24FDXyVkk/kr815yHAhQO0TLslIJOqUes4OFn0ARvFaAVOw==";
try{
System.out.println(validateSignature(as,s));
}catch(Exception e){}
}
private static boolean validate(byte abyte0[], byte abyte1[])
{
Signature signature = null;
boolean flag = false;
try
{
java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("myprikey.dat"));
PrivateKey prikey=(PrivateKey)in.readObject();
in.close();
java.io.ObjectInputStream in2=new java.io.ObjectInputStream(new java.io.FileInputStream("mypubkey.dat"));
PublicKey pubkey=(PublicKey)in2.readObject();
in2.close();
signature = Signature.getInstance("SHA/DSA");
signature.initSign(prikey);
signature.update(abyte0);
byte[] bt = signature.sign();
String encode =new String(Codecs.base64Encode(bt),"UTF-8");
System.out.println(encode);
signature.initVerify(pubkey);
signature.update(abyte0);
flag = signature.verify(abyte1);
}
catch(Exception e)
{
return false;
}
return flag;
}
private static boolean validateSignatureBytes(String as[], byte abyte0[])
throws UnsupportedEncodingException
{
byte abyte1[] = SignableBlock.createSignableBlock(as);
return validate(abyte1, abyte0);
}
public static boolean validateSignature(String as[], String s)
throws UnsupportedEncodingException
{
byte abyte0[];
try
{
abyte0 = Codecs.base64Decode(s.getBytes("UTF-8"));
}
catch(ArrayIndexOutOfBoundsException arrayindexoutofboundsexception)
{
return false;
}
return validateSignatureBytes(as, abyte0);
}
}