BouncyCastleは、RSAアルゴリズムを実現するJavaベースの暗号化、復号化

背景:

       弾む城暗号の暗号化パッケージは、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

 

公開された57元の記事 ウォン称賛36 ビュー60000 +

おすすめ

転載: blog.csdn.net/hqy1719239337/article/details/89028826