背景:
弾む城暗号の暗号化パッケージは、Javaの実装ですが、また、C#バージョン。これは、軽量APIのセットがに含めJ2MEなど、ほとんどの環境で実行することができます含まれています。一部のデバイスは、JSR177もこの暗号化パッケージの暗号化機能を使用することができますサポートしていません。以下のようなと(のような::MD5、SHAなど)、ハッシュアルゴリズム(Base64で例えば)、バイト文字エンコーディング:弾む城は、パケットは、最も人気のある実装暗号化(AES、DES、フグ、などなど)が含まれていた暗号化。
暗号化エンジンによって弾む城API(位置org.bouncycastle.crypto。エンジン)がパスワードを達成するために、これらのエンジンは、特定のインターフェースを実現する、例えばAsymmetricBlockCipherとして、ブロック暗号やストリーム暗号(これらのインタフェースのすべては、パッケージorg.bouncycastle.cryptoであります)を見つけます。これらのインタフェースは、共通の目的を持っている:彼らはあなたの初期化コードは(また、メッセージ・ストリームの一部として提供することができるブロックの形のいずれかで)バイト配列の形でデータを暗号化または復号化するために提供されていることを確認し、そして実行暗号化または復号操作。達成の初期化パスワードとしてJCAとSATSA-CRYPTO APIを使用すると、あなたが使用する暗号化や復号化実現のと同様に、操作のキーの詳細を実行することを指定します。
多くの異なった暗号化アルゴリズムをサポートに加えて、弾む城のAPIも、鍵生成アルゴリズムのパスワードをサポートしています。アプリケーションを作成、鍵の生成と基本的なセキュリティの分布ので、これは、APIの重要な特徴です。
注:がセキュリティキーの生成が弾む城のAPIが提供される重要な機能ですが、これだけの機能が十分ではありません。アプリケーションその鍵と鍵生成を用いた方法も重要である。(安全でないネットワークチャネルを介して共有対称鍵暗号アルゴリズムなど)が弱い交換またはストレージ優れた効果強い鍵生成アルゴリズムを相殺します。
前提:
あなたは使用する必要がありますbcprov-EXT-jdk15on-161.jarのjarパッケージを。
:を参照してくださいhttps://blog.csdn.net/hqy1719239337/article/details/88690163
次のことを達成するために:
package testRsa;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.crypto.generators.*;
import org.bouncycastle.crypto.params.*;
import org.bouncycastle.crypto.*;
import org.bouncycastle.crypto.util.PrivateKeyFactory;
import org.bouncycastle.crypto.util.PrivateKeyInfoFactory;
import org.bouncycastle.crypto.util.PublicKeyFactory;
import org.bouncycastle.crypto.util.SubjectPublicKeyInfoFactory;
import org.bouncycastle.crypto.engines.*;
import org.bouncycastle.asn1.pkcs.*;
import org.bouncycastle.asn1.*;
import java.math.BigInteger;
import java.security.SecureRandom;
import java.util.*;
public class test_rsa {
public static void main(String[] args) throws Exception {
//生成密钥对
RSAKeyPairGenerator rsaKeyPairGenerator = new RSAKeyPairGenerator();
RSAKeyGenerationParameters rsaKeyGenerationParameters = new RSAKeyGenerationParameters(BigInteger.valueOf(3),
new SecureRandom(), 1024, 25);
//初始化参数
rsaKeyPairGenerator.init(rsaKeyGenerationParameters);
AsymmetricCipherKeyPair keyPair = rsaKeyPairGenerator.generateKeyPair();
//公钥
AsymmetricKeyParameter publicKey = keyPair.getPublic();
//私钥
AsymmetricKeyParameter privateKey = keyPair.getPrivate();
SubjectPublicKeyInfo subjectPublicKeyInfo = SubjectPublicKeyInfoFactory.createSubjectPublicKeyInfo(publicKey);
PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.createPrivateKeyInfo(privateKey);
//变字符串
ASN1Object asn1ObjectPublic = subjectPublicKeyInfo.toASN1Primitive();
byte[] publicInfoByte = asn1ObjectPublic.getEncoded();
ASN1Object asn1ObjectPrivate = privateKeyInfo.toASN1Primitive();
byte[] privateInfoByte = asn1ObjectPrivate.getEncoded();
//这里可以将密钥对保存到本地
final Base64.Encoder encoder64 = Base64.getEncoder();
System.out.println("PublicKey:\n" + encoder64.encodeToString(publicInfoByte));
System.out.println("PrivateKey:\n" + encoder64.encodeToString(privateInfoByte));
//加密、解密
ASN1Object pubKeyObj = subjectPublicKeyInfo.toASN1Primitive();//这里也可以从流中读取,从本地导入
AsymmetricKeyParameter pubKey = PublicKeyFactory.createKey(SubjectPublicKeyInfo.getInstance(pubKeyObj));
AsymmetricBlockCipher cipher = new RSAEngine();
cipher.init(true, pubKey);//true表示加密
final Base64.Decoder decoder64 = Base64.getDecoder();
//加密
String data = "成aa功324$$了#*(=-nh)。。。";
System.out.println("\n明文:" + data);
byte[] encryptData = cipher.processBlock(data.getBytes("utf-8")
, 0, data.getBytes("utf-8").length);
System.out.println("密文:" + encoder64.encodeToString(encryptData));
//解密
AsymmetricKeyParameter priKey = PrivateKeyFactory.createKey(privateInfoByte);
cipher.init(false, priKey);//false表示解密
byte[] decriyptData=cipher.processBlock(encryptData, 0, encryptData.length);
String decryptData = new String(decriyptData,"utf-8");
System.out.println("解密后数据:" + decryptData);
}
}
結果:
参考:https://blog.csdn.net/a571574085/article/details/81335095