由Java程序注册机联想到商业版程序的加密方法

简介: 某开发平台的注册机,花了我两个星期的时间才搞定,是什么平台自己去猜,我就不说了! String args = "";是原来的加密信息,有公司名称,只好取掉了。import java.io.ByteArrayOutputStream;import java.security.KeyFactory;import java.security.KeyPair;import java.securit

某开发平台的注册机,花了我两个星期的时间才搞定,是什么平台自己去猜,我就不说了! String args = "";是原来的加密信息,有公司名称,只好取掉了。

import java.io.ByteArrayOutputStream;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Security;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class rsaok {
 private byte[] PrivateKey;

 private byte[] PublicKey;

 public static void main(String[] args) {
  BouncyCastleProvider bouncycastleprovider = new BouncyCastleProvider();
  if (Security.getProperty(bouncycastleprovider.getName()) == null)
   Security.addProvider(bouncycastleprovider);
  rsaok t = new rsaok();
  t.key();
  t.encrypt();
 }

 public void encrypt() {
  String args = "";
  byte abyte0[] = null;
  Cipher cipher;
  byte abyte1[];
  int i;
  ByteArrayOutputStream bytearrayoutputstream;
  int k;
  try {
   PKCS8EncodedKeySpec pkcs8encodedkeyspec = new PKCS8EncodedKeySpec(
     PrivateKey);
   KeyFactory keyfactory = KeyFactory.getInstance("RSA");
   java.security.PrivateKey privatekey = keyfactory
     .generatePrivate(pkcs8encodedkeyspec);
   cipher = Cipher.getInstance("RSA", "BC");
   cipher.init(2, privatekey);
   abyte1 = args.getBytes();
   i = cipher.getBlockSize();
   bytearrayoutputstream = new ByteArrayOutputStream();
   for (k = 0; k < abyte1.length;) {
    int j;
    if (abyte1.length - k >= i)
     j = i;
    else
     j = abyte1.length - k;
    bytearrayoutputstream.write(cipher.doFinal(abyte1, k, j));
    k += i;
   }
   bytearrayoutputstream.flush();
   bytearrayoutputstream.close();
   abyte0 = bytearrayoutputstream.toByteArray();
   System.out.println(byte2hex(abyte0));
   decrypt(abyte0);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 public void decrypt(byte[] abyte1) {
  try {
   String a = "323856EEAD0A7415283B7B58BDCDD6F58A0EB672E9A134C4923D1230D5E2F6B87CD2FAE30E2DB6CB50C60E3C7E91DD9D41938D63B28A0D6BE380EBFA748C99E81A4F983343D80C1541728B1259F49FDB4DCCAA62563AC3C14A91B6C7C374E7AE6B508D79487442B99390AF7C5A699A7040FB6FA7E9EF511003836C646ED45651";
   X509EncodedKeySpec x509encodedkeyspec = new X509EncodedKeySpec(PublicKey);
   //X509EncodedKeySpec x509encodedkeyspec = new X509EncodedKeySpec(hex2byte("30819F300D06092A864886F70D010101050003818D0030818902818100BE0C59D90E7A5A582626A209492452475130557AAE4400180BCB5B0E4138F8C8DED8185E51D17A5FF8B873084742CC245C6DC636432CBAA5401E5312EBA05A4AB79CB71C71A0E0221BB39DA9893026110447F9820B48C88B8A9862ABADB3E5462FADD45E3DD251658F48124C6AA091831404E52471A72A4D6CC989EA4959DECB0203010001"));
   Cipher cipher;
   int i;
   ByteArrayOutputStream bytearrayoutputstream;
   int k;
   KeyFactory keyfactory = KeyFactory.getInstance("RSA");
   java.security.PublicKey publickey = keyfactory
     .generatePublic(x509encodedkeyspec);
   cipher = Cipher.getInstance("RSA", "BC");
   cipher.init(2, publickey);
   i = cipher.getBlockSize();
   bytearrayoutputstream = new ByteArrayOutputStream();
   for (k = 0; k < abyte1.length;) {
    int j;
    if (abyte1.length - k >= i)
     j = i;
    else
     j = abyte1.length - k;
    bytearrayoutputstream.write(cipher.doFinal(abyte1, k, j));
    k += i;
   }
   byte abyte0[];
   bytearrayoutputstream.flush();
   bytearrayoutputstream.close();
   abyte0 = bytearrayoutputstream.toByteArray();
   System.out.println(new String(abyte0));
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 public void key() {
  try {
   KeyPairGenerator kpg = null;
   kpg = KeyPairGenerator.getInstance("RSA", "BC");
   kpg.initialize(1024);
   KeyPair kp = kpg.generateKeyPair();
   PrivateKey = kp.getPrivate().getEncoded();
   System.out.println("PrivateKey:"+byte2hex(PrivateKey));
   PublicKey = kp.getPublic().getEncoded();
   System.out.println("PublicKey:"+byte2hex(PublicKey));
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 private String byte2hex(byte[] b) {
  String hs = "";
  String stmp = "";
  for (int n = 0; n < b.length; n++) {
   stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
   if (stmp.length() == 1)
    hs = hs + "0" + stmp;
   else
    hs = hs + stmp;
   if (n < b.length - 1)
    hs = hs + ":";
  }
  return hs.toUpperCase();
 }

 public byte[] hex2byte(String hex) throws IllegalArgumentException {
  if (hex.length() % 2 != 0) {
   throw new IllegalArgumentException();
  }
  char[] arr = hex.toCharArray();
  byte[] b = new byte[hex.length() / 2];
  for (int i = 0, j = 0, l = hex.length(); i < l; i++, j++) {
   String swap = "" + arr[i++] + arr[i];
   int byteint = Integer.parseInt(swap, 16) & 0xFF;
   b[j] = new Integer(byteint).byteValue();
  }
  return b;
 }
}

相关文章
|
14天前
|
Java
Java中ReentrantLock中tryLock()方法加锁分析
Java中ReentrantLock中tryLock()方法加锁分析
12 0
|
3天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
28 3
|
13天前
|
Java Maven
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
34 3
|
5天前
|
存储 Java
Java动态转发代理IP的实现方法
Java动态转发代理IP的实现方法
21 11
|
6天前
|
Java
Java接口中可以定义哪些方法?
【4月更文挑战第13天】
8 0
Java接口中可以定义哪些方法?
|
12天前
|
Java Shell
Java 21颠覆传统:未命名类与实例Main方法的编码变革
Java 21颠覆传统:未命名类与实例Main方法的编码变革
13 0
|
14天前
|
Java
Java中关于ConditionObject的signal()方法的分析
Java中关于ConditionObject的signal()方法的分析
21 4
|
14天前
|
安全 Java
append在Java中是哪个类下的方法
append在Java中是哪个类下的方法
22 9
|
16天前
|
Java 数据安全/隐私保护
java base64 加密 解密
java base64 加密 解密
|
22天前
|
Java
Java通过反射获取类调用方法
Java通过反射获取类调用方法
18 0