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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 某开发平台的注册机,花了我两个星期的时间才搞定,是什么平台自己去猜,我就不说了! 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;
 }
}

相关文章
|
4天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
31 17
|
8天前
|
存储 安全 Java
|
6天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
11 3
|
8天前
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。
|
6天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
9 2
|
6天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
8 1
|
6天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
16 1
|
6天前
|
Java
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅。它们用于线程间通信,使线程能够协作完成任务。通过这些方法,生产者和消费者线程可以高效地管理共享资源,确保程序的有序运行。正确使用这些方法需要遵循同步规则,避免虚假唤醒等问题。示例代码展示了如何在生产者-消费者模型中使用`wait()`和`notify()`。
12 1
|
6天前
|
安全 Java 开发者
Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用
本文深入解析了Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用。通过示例代码展示了如何正确使用这些方法,并分享了最佳实践,帮助开发者避免常见陷阱,提高多线程程序的稳定性和效率。
17 1
|
6天前
|
Java
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件成立时被唤醒,从而有效解决数据一致性和同步问题。本文通过对比其他通信机制,展示了 `wait()` 和 `notify()` 的优势,并通过生产者-消费者模型的示例代码,详细说明了其使用方法和重要性。
14 1