HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2020/01/11

Visual Studio 2013の .NET C#で RSA暗号処理する方法、OpenSSLとの連携方法 Visual Studio 2013の .NET C#で RSA暗号処理する方法、OpenSSLとの連携方法

(C# .NETで公開鍵暗号方式の RSA暗号処理と OpenSSLと連携する方法を解説)

Tags: [Windows], [無人インストール]




● Android Java言語で RSA暗号処理する方法、OpenSSLとの連携方法

2020/01/11
Java言語で RSA暗号処理する方法、OpenSSLとの連携方法、Androidにも対応
Java言語で RSA暗号処理する方法、OpenSSLとの連携方法、Androidにも対応

  Java言語で公開鍵暗号方式の RSA暗号処理と OpenSSLと連携する方法を解説


● Windowsで OpenSSLを使用して RSA暗号の暗号化、復号化をコマンドラインで実行する方法

2020/01/11
OpenSSLコマンドを使って RSA暗号処理する方法
OpenSSLコマンドを使って RSA暗号処理する方法

  OpenSSLコマンドで公開鍵暗号方式の RSA暗号処理する方法を解説


● Microsoft Visual Studio 2013の C# .NETで RSA暗号処理する方法、OpenSSLとの連携方法

 Visual Studio 2013の C# .NETを使用して RSA暗号処理を試してみます。
 2020年になり、情報セキュリティの関係で今後ますます暗号化の需要が高まると思います。

 と言う訳で RSA暗号処理を実装できる様になります。


● RSA公開鍵暗号方式とは?

 RSAは公開鍵暗号方式で「公開鍵」「秘密鍵」の2種類のペアの鍵を用います。暗号と復号の鍵が異なるので「非対称暗号方式」とも言います。

 「公開鍵」=公開しても良い鍵
 「秘密鍵」=秘密にする鍵

 暗号と復号の鍵が同じものは「対称暗号方式」と言います。

 RSA暗号の鍵のビット長は現在は 2048bit以上が推奨されています。
 1024bit長の鍵は現在では既に「解読」されます。
 (現在のコンピュータの処理能力で短時間で演算処理して「秘密鍵」を求める事ができる)

 2048bit長の鍵の推奨される利用期間は 2030年末までとされています。
 (少なくとも暗号アルゴリズムの安全性が確保されると見込まれる期間)
 (現在のコンピュータの進化では 2050年頃には 2048bit長の RSA鍵が危殆化すると予想されています)

 現在が 2020年で、2030年までは 10年しかないのと、昨今のコンピュータの進化速度から 2048bit長でも不安があります。

 このぶんだと先を見越して 3072bit位を使用しておくのが「安全」と思います。
 ただし、ビット長が増加すると暗号化・復号化の処理の負荷が増加します。
 また、効率的な演算手法が「発見」された場合、そもそも RSA暗号方式そのものが「無力」になる可能性もあります。

● 各種暗号、ハッシュ関数の 2030年問題の一覧表

 2031年からは Security Strength 128以上が必須となる。
 (Security Strength 128未満は古いシステム用に「使用だけ」は許可 Legacy use)

NIST Special Publication 800-57 Recommendation for Key Management
Page 52 Table 2: Comparable strengths
Page 54 Table 3: Hash functions that can be used to provide the targeted security strengths
Page 55 Table 4: Security-strength time frames
 より引用して合成して作成

暗号強度公開鍵暗号
RSA暗号方式
鍵ビット長
公開鍵暗号
ECDSA暗号方式
(楕円曲線暗号)
鍵ビット長
共通鍵暗号
AES暗号方式
鍵ビット長
SHAハッシュ関数HMAC 暗号ハッシュ関数2030年末まで2031年以降
80以下
(112未満)
10241602TDEASHA-1--×
Legacy use
×
Legacy use
11220482243TDEASHA-224、SHA-512/224--×
Legacy use
1283072256AES-128SHA-256、SHA-512/256SHA-1
1927680384AES-192SHA-384SHA-224、SHA-512/224
25615360512AES-256SHA-512SHA-256、SHA-512/256

● EMVCoの資料
EMV SWG NH90 Notice Bulletin No. 23 July 2019 EMVCo Annual RSA Key Lengths Assessment
 より引用
RSA暗号方式
鍵ビット長
利用期限特定用途での延長
1408-bit2024年末まで2025年末まで
1984-bit2029年末まで--

● CRYPTREC Report 2016
CRYPTREC Report 2016
CRYPTREC Report 2016の公開 平成29年6月30日

 付録 A.3 予測図の更新(素因数分解問題及び楕円曲線上の離散対数問題の困難性)より引用

・CRYPTREC Report 2016 付録 A.3 予測図の更新(素因数分解問題及び楕円曲線上の離散対数問題の困難性)
CRYPTREC Report 2016 付録 A.3 予測図の更新(素因数分解問題及び楕円曲線上の離散対数問題の困難性)




● 暗号用語

 平文 = 元の文
 暗号文 = 暗号化した文
 暗号化 = 平文を暗号化して暗号文にする事
 復号化 = 暗号文を解読して平文に戻す事


● RSA公開鍵暗号方式の基本的な使い方

 その1:「送信者」が「受信者」だけに「メッセージ」を届ける場合
 ・「受信者」は「公開鍵」「秘密鍵」のペアの RSA鍵を生成する
 ・「送信者」は「受信者」から「公開鍵」を受け取る
 ・「送信者」はその「公開鍵」を使って「メッセージ」を暗号化する
 ・「送信者」は「暗号化メッセージ」を「受信者」に送信する
 ・「受信者」は「暗号化メッセージ」を「自分の秘密鍵」で復号化する
 ・「受信者」は「復号化メッセージ」を読む

 その2:「送信者」が自分である事を「受信者」に「認証・証明」したい場合
 ・「送信者」は「公開鍵」「秘密鍵」のペアの RSA鍵を生成する
 ・「送信者」は自分の「秘密鍵」を使って「メッセージ」を暗号化する
 ・「送信者」は「暗号化メッセージ」を「受信者」に送信する
 ・「受信者」は「暗号化メッセージ」を送信者の「公開鍵」で復号化する
 ・正常に復号化できれば「送信者」本人が送信した「メッセージ」である事が「認証・証明」できる

使い方目的暗号化復号化補足
その1メッセージの秘匿送信「受信者」の「公開鍵」「受信者」の「秘密鍵」受信者以外は暗号化メッセージを解読できない
その2自分である事の認証・証明「送信者」の「秘密鍵」「送信者」の「公開鍵」送信者以外は暗号化メッセージを作れない


● RSA公開鍵暗号方式の基本的な暗号強度の考え

 ある素数pとq、p*q=nの3個の数値がある場合に、
 ・p*qを演算してnを求めるのは簡単
 ・nの値から素数のpとqを求めるのは困難(pとqは素数である事)

 RSA暗号の暗号解読の難易度は、素数同士の積を求める事は(掛け算するだけだから)簡単であるが、逆に素数同士の積の値から素因数分解を求めるのが難しいと言う一方向性の数学的性質を利用しています。

 この場合、
 ・pとqが秘密鍵
 ・nが公開鍵
 になります。

RSA暗号 - Wikipedia

 面白記事
世界最小のRSA鍵ペアは何bitか
続・世界最小のRSA鍵ペアは何bitか

●楕円曲線暗号 Elliptic Curve Cryptography ECC

 楕円曲線を利用した暗号方式の総称で、RSAと同様の「公開鍵暗号」も実装できる。
 楕円曲線上の離散対数問題 (EC-DLP) の困難性を安全性の根拠とする暗号。
 楕円曲線暗号で有名なものとして ECDSAや ECDH等がある。

 RSA暗号などと比べた場合に同レベルの安全性をより短い鍵で実現でき、処理速度も速いのが利点。

楕円曲線暗号


● 公開鍵暗号は「ゴルゴ13」のデューク・トウゴウも関係しています。「最終暗号」

 ゴルゴ13 「最終暗号」

 数学者の佐久シゲルが解読不可能な暗号方式(最終暗号)を開発し、一般に公開しようとするのをアメリカの NSA(国家安全保障局)が妨害すると言うお話。

 なぜ妨害するかと言うと「解読不可能な暗号方式」で通信を行なわれると NSAが傍受・盗聴して通信内容を監視する事ができなくなるから。

 ゴルゴ13 デューク・トウゴウは佐久シゲルの学会での講演を聞き、その内容の意味(最終暗号の理論)を理解し、その最終暗号の開発が無事に完成する様に、また、NSAからの妨害工作から佐久シゲルを守るべくボディガードと支援を申し出る事にした。。。

 なお、既に各方面からツッコミが入っていますが「最終暗号」作中の「平方根を求める事は難しくても、~」の部分は誤りで、平方根を求めるのは「開平法」で手計算でも(頑張れば)できます。

 佐久シゲルのモデル 小平邦彦
小平邦彦
 小平次元、小平消滅定理、小平・スペンサー理論等に名を残している。

 NSA(アメリカ国家安全保障局)による市販ソフトウェアに仕込まれたバックドア(裏口)
NSA's Backdoor Key from Lotus-Notes
 "1984" O=MiniTruth CN=Big Brother


ゴルゴ13 (Volume108) 最終暗号 (SPコミックスコンパクト) (日本語) コミック - 2007/9/28
ASIN: 4845830612

ゴルゴ13 (129) (SPコミックス) (日本語) コミック - 2003/7/5
ASIN: 4845801299

ゴルゴ13 THE LAST CODE〜最終暗号〜 (My first big) (日本語) ムック - 2015/8/7
ASIN: 4091198481

暗号解読(上) (新潮文庫) (日本語) 文庫 - 2007/6/28
ASIN: 410215972X


● C#で RSA暗号の鍵を扱う場合の参考資料

RSACryptoServiceProvider

 DER ASN.1 parser decoder C#
Cryptographic Interoperability: Keys
AsnKeyParser.cs
BerDecodeError.cs
BigInteger.cs

AsnKeyParser.cs

● Cryptographic Data Structures

MSPRIVATEKEYBLOB MS PRIVATEKEYBLOB MFC
MSPUBLICKEYBLOB MS PUBLICKEYBLOB MFC

2.4.1 PUBLICKEYBLOB

2.2.2.9.1 RSA Private Key BLOB PRIVATEKEYBLOB

BLOBHEADER structure

2.2.11.2.1 RSA Key Pair

2.5.2.1 Conversion from RSA Public Key to publicKeyToken

CryptoAPI PRIVATEKEYBLOB to Java PrivateKey Converter


● C# .NETの RSA暗号処理クラス RSACryptoServiceProviderの制限事項

 C#の RSACryptoServiceProviderクラスでは、RSA鍵のビット長に短いビット長と指定できない。
 Windows 8.1未満:384 ~ 16384ビット
 Windows 8.1以降:512 ~ 16384ビット

 C#の RSACryptoServiceProviderクラスでは、RSAの「公開鍵」を使って復号化(暗号の解除)ができません。
 例外 System.Security.Cryptography.CryptographicException: キーが正しくありません。

 そもそもで、RSA暗号の使用方法として「公開鍵」を使っての「復号化」は想定していない。
 その為、C#の RSACryptoServiceProviderクラスでも対応せずに「例外発生」となる様です。
 上記の「RSA公開鍵暗号方式の基本的な使い方」の「その2」の使い方ができない。

● .NET C#の RSACryptoServiceProviderクラスでRSAの「公開鍵」で「復号化」できない制限の解決方法

 下記リンクの上2個のライブラリを使うのが簡単。
 ・新規に RSAxクラスを作成。
 ・元の RSACryptoServiceProviderクラスを拡張。(.NET 4以降)

RSA Library with Private Key Encryption in C#
 新規に RSAxクラスを作成。
RSAx

string PlainText = "Encrypt Me";
string KeyInfo = ".....";
RSAx rsa = new RSAx(KeyInfo, 1024);
byte[] CTX = rsax.Encrypt(Encoding.UTF8.GetBytes(PlainText), true);
string CipherText = Convert.ToBase64String(CTX);

byte[] ETX = Convert.FromBase64String(CipherText);
byte[] PTX = rsax.Decrypt(ETX, true);
string DecryptedString = Encoding.UTF8.GetString(PTX);


RSA Private Key Encryption
 RSACryptoServiceProviderクラスを拡張。(.NET 4以降)
 内部処理で BigInteger.ModPowを使用して自前で計算している。
 ※ 処理できるデータの最大長の計算が固定式 int maxDataLength = (rsa.KeySize / 8) - 6;
namespace RSAExtensions
public static class RSAPrivateEncryption

byte[] PrivateEncryption(byte[] data)
byte[] PublicDecryption(byte[] encryptedData)

string secret = "My secret message";
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(512);  // Key bits length
/*
* Skip the loading part for the RSACryptoServiceProvider will generate
* random Private / Public keys pair, that you can save later with
* rsa.ToXmlString(true);
*
string key = "private or public key as xml string";
rsa.FromXmlString(key);
*/
byte[] secretData = Encoding.UTF8.GetBytes(secret);

byte[] encrypted = rsa.PrivareEncryption(secretData);

byte[] decrypted = rsa.PublicDecryption(encrypted);

string decString = Encoding.UTF8.GetString(decrypted);  // And back to string
Assert.AreEqual("My secret message", decString);

Public Key RSA Encryption in C# .NET

Using RSA Public Key Encryption in a Shared Web Hosting Environment

Encrypt and decrypt a string in C# ?

How to encrypt with private key and decrypt with public key in c# RSA

RSA private key encryption

IEEE P1363
Traditional public-key cryptography (IEEE Std 1363-2000 and 1363a-2004)
Lattice-based public-key cryptography (IEEE Std 1363.1-2008)
Password-based public-key cryptography (IEEE Std 1363.2-2008)
Identity-based public-key cryptography using pairings (P1363.3)

How to encrypt with private key and decrypt with public key in dotnet core RSA

Can one encrypt with a private key/decrypt with a public key ?


● Microsoft Visual Studio 2013の C# .NETで RSA暗号処理する方法、OpenSSLとの連携方法のサンプルプログラム

 C#の RSACryptoServiceProviderクラスでは、RSA鍵のビット長は 512ビット以上の必要があります。最大は 16384ビットまで。

 C#の RSACryptoServiceProviderクラスでは、RSAの「公開鍵」を使って復号化(暗号の解除)ができません。
 例外 System.Security.Cryptography.CryptographicException: キーが正しくありません。

 C# .NET RSACryptoServiceProvider、RSAParametersを使用した RSA暗号化処理のサンプルプログラム

 ASN.1形式のパースに下記ファイルが必要です。
AsnKeyParser.cs
BerDecodeError.cs
BigInteger.cs

 AsnKeyParser.csを一部改造します。(下記参照)

Program.cs
C#の内部で RSA鍵ファイルを生成して RSAの暗号化と復号化のサンプル
外部の DER形式の鍵ファイルを C#で読み込んで RSAの暗号化と復号化のサンプル

using System;
using System.IO;
using System.Text;

 // https://docs.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsacryptoserviceprovider?view=netframework-4.8
using System.Security.Cryptography;

 // https://www.codeproject.com/articles/25487/cryptographic-interoperability-keys
using CSInteropKeys;

namespace TestRSACryptoServiceProvider
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // RSA KeySize = 2048 bit(Windows 8.1 = 512 to 16384)
                int dwKeySize = 2048;

                // false = PKCS#1 v1.5 padding, true = OAEP 最適非対称暗号化パディング
                // false = "RSA/ECB/PKCS1Padding", "RSA/NONE/PKCS1Padding"に相当
                // true = "RSA/ECB/OAEPPadding", "RSA/NONE/OAEPPadding"に相当
                bool fOAEP = false;

                // Create a UnicodeEncoder to convert between byte array and string.
                // UnicodeEncoding ByteConverter = new UnicodeEncoding();

                // Create byte arrays to hold original, encrypted, and decrypted data.
                // byte[] dataToEncrypt = ByteConverter.GetBytes("Data to Encrypt あいう");
                byte[] dataToEncrypt;
                byte[] encryptedData;
                byte[] decryptedData;


                // C#の内部で RSA鍵ファイルを生成して RSAの暗号化と復号化のサンプル

                // Create a new instance of RSACryptoServiceProvider to generate
                // public and private key data.
                using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(dwKeySize))
                {
                    Console.WriteLine("========");
                    string plainText = "C#の内部で RSA鍵ファイルを生成して RSAの暗号化と復号化のサンプル";
                    Console.WriteLine(plainText);

                    dataToEncrypt = Encoding.UTF8.GetBytes(plainText);

                    Console.WriteLine("RSA.KeySize : {0}\n", RSA.KeySize);

                    // 「公開鍵」で平文データを RSA暗号化する
                    // Pass the data to ENCRYPT, the public key information
                    // (using RSACryptoServiceProvider.ExportParameters(false),
                    // and a boolean flag specifying no OAEP padding.
                    printRSAKeyInfo(RSA.ExportParameters(false), false);
                    encryptedData = RSAEncrypt(dataToEncrypt, RSA.ExportParameters(false), fOAEP);

                    // 「秘密鍵」で暗号済みデータを RSA復号化する
                    // Pass the data to DECRYPT, the private key information
                    // (using RSACryptoServiceProvider.ExportParameters(true),
                    // and a boolean flag specifying no OAEP padding.
                    printRSAKeyInfo(RSA.ExportParameters(true), true);
                    decryptedData = RSADecrypt(encryptedData, RSA.ExportParameters(true), fOAEP);

                    // Display the decrypted plaintext to the console.
                    Console.WriteLine("Decrypted plaintext: {0}", Encoding.UTF8.GetString(decryptedData));

 /*
                    // .NET C# RSACryptoServiceProviderは「公開鍵」では RSA復号化できない
                    // 「秘密鍵」で平文データを RSA暗号化する
                    // Pass the data to ENCRYPT, the public key information
                    // (using RSACryptoServiceProvider.ExportParameters(false),
                    // and a boolean flag specifying no OAEP padding.
                    printRSAKeyInfo(RSA.ExportParameters(true), true);
                    encryptedData = RSAEncrypt(dataToEncrypt, RSA.ExportParameters(true), fOAEP);

                    // 「公開鍵」で暗号済みデータを RSA復号化する
                    // Pass the data to DECRYPT, the private key information
                    // (using RSACryptoServiceProvider.ExportParameters(true),
                    // and a boolean flag specifying no OAEP padding.
                    printRSAKeyInfo(RSA.ExportParameters(false), false);
                    decryptedData = RSADecrypt(encryptedData, RSA.ExportParameters(false), fOAEP);
System.Security.Cryptography.CryptographicException: キーが正しくありません。
   場所 System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
   場所 System.Security.Cryptography.Utils._DecryptKey(SafeKeyHandle hPubKey, Byte[] key, Int32 dwFlags)
   場所 System.Security.Cryptography.RSACryptoServiceProvider.Decrypt(Byte[] rgb, Boolean fOAEP)

                    // Display the decrypted plaintext to the console.
                    Console.WriteLine("Decrypted plaintext: {0}", Encoding.UTF8.GetString(decryptedData));
 */

                    // C#で生成した RSA鍵ファイルを MSBLOB形式で保存するサンプル
                    // 「秘密鍵」を PRIVATEKEYBLOB形式で保存
                    bool includePrivateParameters = true;
                    byte[] privateKeyBlob = RSA.ExportCspBlob(includePrivateParameters);
                    string fileName = @"PRIVATEKEY.msblob";
                    using (var writer = new BinaryWriter(new FileStream(fileName, FileMode.Create)))
                    {
                        writer.Write(privateKeyBlob);
                    }

                    // 「公開鍵」を PUBLICKEYBLOB形式で保存
                    includePrivateParameters = false;
                    byte[] publicKeyBlob = RSA.ExportCspBlob(includePrivateParameters);
                    fileName = @"PUBLICKEY.msblob";
                    using (var writer = new BinaryWriter(new FileStream(fileName, FileMode.Create)))
                    {
                        writer.Write(publicKeyBlob);
                    }

                    // C#側で RSA暗号化したデータをファイルに書き出す
                    // C#側で「公開鍵」で暗号化したデータを下記のコマンドラインで「秘密鍵」で RSA復号化できる
                    // openssl rsa -in PRIVATEKEY.msblob -inform msblob -out private-cs-key.pem
                    // openssl rsautl -decrypt -inkey private-cs-key.pem -in test_cs.enc -out decode_test_cs.txt
                    fileName = @"test_cs.enc";
                    using (var writer = new BinaryWriter(new FileStream(fileName, FileMode.Create)))
                    {
                        writer.Write(encryptedData);
                    }
                }


                // DER形式の鍵ファイルを C#で読み込んで RSAの暗号化と復号化のサンプル
                {
                    Console.WriteLine("========");
                    string plainText = "DER形式の鍵ファイルを C#で読み込んで RSAの暗号化と復号化のサンプル";
                    Console.WriteLine(plainText);

                    dataToEncrypt = Encoding.UTF8.GetBytes(plainText);

                    // 外部で生成した RSA鍵ファイルを C#で読み込むサンプル
                    // AsnKeyParser ASN.1/DER parser class
                    // 「秘密鍵」
                    AsnKeyParser privateKeyParser = new AsnKeyParser("private-key.der");
                    RSAParameters privateKey = privateKeyParser.ParseRSAPrivateKey();

                    // 「公開鍵」
                    AsnKeyParser publicKeyParser = new AsnKeyParser("public-key.der");
                    RSAParameters publicKey = publicKeyParser.ParseRSAPublicKey();

                    // .Net class CspParametersは不要
                    // CspParameters csp = new CspParameters();
                    // csp.KeyContainerName = "KeyContainerName";
                    // csp.ProviderType = 1;    // ProviderType.PROV_RSA_FULL
                    // csp.KeyNumber = (int)KeyNumber.Exchange;      // 1

                    // .Net class RSACryptoServiceProviderのコンストラクタに引数は不要
                    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                    rsa.PersistKeyInCsp = false; // 暗号化サービス プロバイダー (CSP) にキーを保存するかどうか?

                    // "public-key.der" 「公開鍵」で平文データを RSA暗号化する
                    printRSAKeyInfo(publicKey, false);
                    encryptedData = RSAEncrypt(dataToEncrypt, publicKey, fOAEP);

                    // C#側で RSA暗号化したデータをファイルに書き出す
                    // C#側で「公開鍵」で暗号化したデータを下記のコマンドラインで「秘密鍵」で RSA復号化できる
                    // openssl rsautl -decrypt -inkey private-key.pem -in test.enc -out test_decode.txt
                    string fileName = @"test.enc";
                    using (var writer = new BinaryWriter(new FileStream(fileName, FileMode.Create)))
                    {
                        writer.Write(encryptedData);
                    }

                    // "private-key.der" 「秘密鍵」で暗号済みデータを RSA復号化する
                    // 「公開鍵」では復号化できない CryptographicExceptionになる
                    printRSAKeyInfo(privateKey, true);
                    decryptedData = RSADecrypt(encryptedData, privateKey, fOAEP);

                    // Display the decrypted plaintext to the console.
                    Console.WriteLine("Decrypted plaintext: {0}", Encoding.UTF8.GetString(decryptedData));
                }
            }
            catch (ArgumentNullException)
            {
                // Catch this exception in case the encryption did
                // not succeed.
                Console.WriteLine("Encryption failed.");
            }
        }

        public static string BytesToStr(byte[] bytes)
        {
            StringBuilder str = new StringBuilder();

            for (int i = 0; i < bytes.Length; i++)
                str.AppendFormat("{0:X2}", bytes[i]);

            return str.ToString();
        }

        public static void printRSAKeyInfo(RSAParameters RSAKeyInfo, bool isPrivate)
        {
            byte[] M = RSAKeyInfo.Modulus; // modulus
            byte[] Ex = RSAKeyInfo.Exponent; // publicExponent
            Console.WriteLine("");
            Console.WriteLine("=== RSAKeyInfo ===");
            Console.WriteLine("M  : {0}", BytesToStr(M));
            Console.WriteLine("Ex : {0}", BytesToStr(Ex));
            if (isPrivate)
            {
                byte[] D = RSAKeyInfo.D; // privateExponent
                byte[] P = RSAKeyInfo.P; // prime1
                byte[] Q = RSAKeyInfo.Q; // prime2
                byte[] DP = RSAKeyInfo.DP; // exponent1
                byte[] DQ = RSAKeyInfo.DQ; // exponent2
                byte[] IQ = RSAKeyInfo.InverseQ; // coefficient

                Console.WriteLine("---");
                Console.WriteLine("D  : {0}", BytesToStr(D));
                Console.WriteLine("P  : {0}", BytesToStr(P));
                Console.WriteLine("Q  : {0}", BytesToStr(Q));
                Console.WriteLine("DP : {0}", BytesToStr(DP));
                Console.WriteLine("DQ : {0}", BytesToStr(DQ));
                Console.WriteLine("IQ : {0}", BytesToStr(IQ));
            }
        }

        public static byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
        {
            Console.WriteLine("DataToEncrypt     : {0}\n", BytesToStr(DataToEncrypt));

            try
            {
                byte[] encryptedData;
                //Create a new instance of RSACryptoServiceProvider.
                using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
                {
                    // Import the RSA Key information. This only needs
                    // toinclude the public key information.
                    RSA.ImportParameters(RSAKeyInfo);

                    // Encrypt the passed byte array and specify OAEP padding.
                    // OAEP padding is only available on Microsoft Windows XP or
                    // later.
                    encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
                }
                return encryptedData;
            }
            catch (CryptographicException e)
            {
                // Catch and display a CryptographicException
                // to the console.
                Console.WriteLine(e.Message);
                return null;
            }
        }

        public static byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
        {
            Console.WriteLine("DataToDecrypt     : {0}\n", BytesToStr(DataToDecrypt));

            try
            {
                byte[] decryptedData;
                // Create a new instance of RSACryptoServiceProvider.
                using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
                {
                    // Import the RSA Key information. This needs
                    // to include the private key information.
                    RSA.ImportParameters(RSAKeyInfo);

                    // Decrypt the passed byte array and specify OAEP padding.
                    // OAEP padding is only available on Microsoft Windows XP or
                    // later.
                    decryptedData = RSA.Decrypt(DataToDecrypt, DoOAEPPadding);
                }
                return decryptedData;
            }
            catch (CryptographicException e)
            {
                // Catch and display a CryptographicException
                // to the console.
                Console.WriteLine(e.ToString());
                return null;
            }
        }
    }
}

AsnKeyParser.cs
.. 省略 ..

    internal RSAParameters ParseRSAPrivateKey()
    {
.. 省略 ..
      // Checkpoint
      position = parser.CurrentPosition();
      // Version
      value = parser.NextInteger();
      if (0x00 != value[0])
      {
        StringBuilder sb = new StringBuilder("Incorrect PrivateKeyInfo Version. ");
        BigInteger v = new BigInteger(value);
        sb.AppendFormat("Expected: 0, Specified: {0}", v.ToString(10));
        throw new BerDecodeException(sb.ToString(), position);
      }

/*
    ここの処理はスキップする

      // Checkpoint
      position = parser.CurrentPosition();
      // Ignore Sequence - AlgorithmIdentifier
      length = parser.NextSequence();
      if (length > parser.RemainingBytes())
      {
        StringBuilder sb = new StringBuilder("Incorrect AlgorithmIdentifier Size. ");
        sb.AppendFormat("Specified: {0}, Remaining: {1}",
          length.ToString(CultureInfo.InvariantCulture),
          parser.RemainingBytes().ToString(CultureInfo.InvariantCulture));
        throw new BerDecodeException(sb.ToString(), position);
      }

.. 省略 ..
.. 省略 ..

      // Checkpoint
      position = parser.CurrentPosition();
      // Version
      value = parser.NextInteger();
      if (0x00 != value[0])
      {
        StringBuilder sb = new StringBuilder("Incorrect RSAPrivateKey Version. ");
        BigInteger v = new BigInteger(value);
        sb.AppendFormat("Expected: 0, Specified: {0}", v.ToString(10));
        throw new BerDecodeException(sb.ToString(), position);
      }
    ここまで
*/

      parameters.Modulus = TrimLeadingZero(parser.NextInteger());
      parameters.Exponent = TrimLeadingZero(parser.NextInteger());
      parameters.D = TrimLeadingZero(parser.NextInteger());
.. 省略 ..


●実行結果
> TestRSACryptoServiceProvider.exe
========
C#の内部で RSA鍵ファイルを生成して RSAの暗号化と復号化のサンプル
RSA.KeySize : 2048


=== RSAKeyInfo ===
M  : B8C0CBBD652B6761DD22A252F96EB3375E68A5206CE2FE6DAA4E103860B30574EC15550F42AF037D113B72327429A18EF45617543AB8FCFC10533AC9D1A4C1D98E2105933292A11E2044953987EE1BBF9D53DE10A924D02A519EAFF93F76AED716440021E4DED2276FA1344BA2C0143AEDA05D6DBF35D370CBA89E8FD28B15833DD7F00D2655CF003C27846A25D174EA5CCCCD7A698269C2255AB9AC0D9164F5B52D2856564C70F87C27DF3BE78F450E03A1A63E8302E169D50237B43D5C31C5581D12E19364C9C2C76FF394917B6FC3284DCA98DC8F45C0EF88970AC167CE871B9FB7A8D1FB411F47BD09404B5180B2EA701096ECB07FD34E0877453AF63015
Ex : 010001
DataToEncrypt     : 4323E381AEE58685E983A8E381A720525341E98DB5E38395E382A1E382A4E383ABE38292E7949FE68890E38197E381A620525341E381AEE69A97E58FB7E58C96E381A8E5BEA9E58FB7E58C96E381AEE382B5E383B3E38397E383AB


=== RSAKeyInfo ===
M  : B8C0CBBD652B6761DD22A252F96EB3375E68A5206CE2FE6DAA4E103860B30574EC15550F42AF037D113B72327429A18EF45617543AB8FCFC10533AC9D1A4C1D98E2105933292A11E2044953987EE1BBF9D53DE10A924D02A519EAFF93F76AED716440021E4DED2276FA1344BA2C0143AEDA05D6DBF35D370CBA89E8FD28B15833DD7F00D2655CF003C27846A25D174EA5CCCCD7A698269C2255AB9AC0D9164F5B52D2856564C70F87C27DF3BE78F450E03A1A63E8302E169D50237B43D5C31C5581D12E19364C9C2C76FF394917B6FC3284DCA98DC8F45C0EF88970AC167CE871B9FB7A8D1FB411F47BD09404B5180B2EA701096ECB07FD34E0877453AF63015
Ex : 010001
---
D  : B24E4FD3C01A3DB2738B8381F4FD63B5A245F867ECEEBE82F484569F32A45435DDCB50C663A32908C162CFF9E5A67027D9A464EB83A9196FE4098F894BED68B120BCB9F6B02E57950DAB63219D10AE7325D1D555DB088E66E952EF9EEC230CE6C4B468344E00C66E0D0C55BE519A736BD3FE9B6CD9C787032B6AD76D12D3ECB391183DC941B8513B0A33E43F2C8805A99D65008B9250B73A229C7256411F7F85F98F85A2B6411A6490D3A1D75588BD9FC715AE7F59AAA67E4A823E116547CE8572FB63EDA0743E59064C387DCD4376A5247186E739DF3A9DE03D8857996EFA061F5A7D3E8ABFC40BA4377366B4D18E170C48F051478C950F8AA56CE75DD0AC59
P  : F18EB645D469319AEBCABBBD5A76BC83EA3BA64B7335814A07F1A8E061B176DF90EA6DAD0B672B0E9C72226CB248FFDA18C1AE50C6B9F407B8EEF7C5049F9F11313D113FB606003CE153D6FD75E102F749E36217B38625EC0D5E8F7B624B555732A05D00CE9603C0D35F0CCF46758D702594DCEF8D853F2E3F699E343BEEA193
Q  : C3CCA25577C0D7916AC189EF7C19D09F19643A1101F4B3421B4B98B287EB192B62E271AB429327FCFB1C373D82DF1CE154B16ECC2A59C7B6CB473979E9DD0EFCB546C4578B54513A6F9AA5B9A85E2496766D259D17AFBF3B2AAA05EB98E1C58AA1BC662BCE44845F13A957BC14ED2A1195444123925E988393F484853C4A90B7
DP : 33D296302CFDD472941B8E637540FBF8A10BE30554D629C2A429A83D5B3823749B3670092BE51A4BAC2CA04E0981B7C2268586CC3596375060D083BF74DA79D9CA627B8CDB943600D9A68EFD19890885DD0837473670953A2B341A3C323E4F34C1DBBD982AB9EC5C35FCB256D59AEA9920B6EB1F49914898B76A0552D778BE99
DQ : B7644C08518A465EE5E7311326E1E70D9DF2CA90738C86FA3C26AA774DE75E43CCF2DC14D4DE906DDBA5A9F7EB449F004F1B81F3A9173E807015DE37DA5C3B5567554941D636BB7E485A492F840BE9A9247346EFC4E7CFEDD3203D3B568EE13FE00D5E855945C3D669CC0B691710AC7E9B98BA8A5EE64B63B2892C36BF29F831
IQ : 252F90E2F4A787991A56238CCB539D5C7028AC8CF1F5DCEFB35661C648AACA2C66DCF707B441C4BAD2911F8F1FB820C5212CE796F0910BB2C2F785DF95D1653A0B443E5E21545C1BE4D744C1AA7C213A7DF80982766FF3973C7DD0218B73536856D00B7E1C3394725D6BF669107C058D4B9E2BC99DD88C05D2D1333D59953DD5
DataToDecrypt     : 39494AB7C6AE2BF81618CF218FDA69372EEDD66B7D371C0616F52755FB682527B59C1B800E775E417F81383BC54E2B64056E6708F10EC3A9D4D6E75BC67B460E915A2DD3FF7A31FA4E762E302F419EFEAA847B6C669F14FD99DCAE84F86A4C02BB6071FF843BCB886524EFF40DDCB2116CE957A91D1BD94F7ACB3F52F91A7399647E45B9DE37243047624FB0F7E3BFF6EF476789F9124CF43E92E6EACDF4C7183D70BB026AE6C1EC7ACFB71D755F1575AE59B250E112D4E74210185034AADC06AE7072C22944A31152D1581A3F7351F176A0E067D870B3BFAACE34BB2C3AFEF684FC0A427CD70366A2E4703BE39CDA820795D0C690008E45D6F9C7D6711446CB

Decrypted plaintext: C#の内部で RSA鍵ファイルを生成して RSAの暗号化と復号化のサ ンプル

========
DER形式の鍵ファイルを C#で読み込んで RSAの暗号化と復号化のサンプル

=== RSAKeyInfo ===
M  : A34F862E04F6F43FD1958163D26281C15CC1968392597272E616CF0E94551A515525FE352C9D2F4C549407633BC5B5A29010A423213FBD7539A0A6A1C823EA8B303EDBAD41D33B7A43E94CE632CBF2DE1FA5A28E7E9E5135A95CA94CBA84E23FC2C2873AE8EAE22D58D7CBD208103D891D05B37C261950BDA09026364117B3C5B460E35B80F3AFBE68FF67F8EB16A2469C9A3E9420BFBC5876AC6F1EA9B2EE7AAAE7B3A416E4F611EA4A08C6769842188AAF97BE8CD865E8BE8C0632103CA7F28CDDA95FEF2AB253FC8AF8A0BD8B9369D80FC9C8A7EE6572D4EF117D5B8119625C94F448475BDA63748DA186AA35977D2DFFB1515465F8E924BB2726A73005EF
Ex : 010001
DataToEncrypt     : 444552E5BDA2E5BC8FE381AEE98DB5E38395E382A1E382A4E383ABE38292204323E381A7E8AAADE381BFE8BEBCE38293E381A720525341E381AEE69A97E58FB7E58C96E381A8E5BEA9E58FB7E58C96E381AEE382B5E383B3E38397E383AB


=== RSAKeyInfo ===
M  : A34F862E04F6F43FD1958163D26281C15CC1968392597272E616CF0E94551A515525FE352C9D2F4C549407633BC5B5A29010A423213FBD7539A0A6A1C823EA8B303EDBAD41D33B7A43E94CE632CBF2DE1FA5A28E7E9E5135A95CA94CBA84E23FC2C2873AE8EAE22D58D7CBD208103D891D05B37C261950BDA09026364117B3C5B460E35B80F3AFBE68FF67F8EB16A2469C9A3E9420BFBC5876AC6F1EA9B2EE7AAAE7B3A416E4F611EA4A08C6769842188AAF97BE8CD865E8BE8C0632103CA7F28CDDA95FEF2AB253FC8AF8A0BD8B9369D80FC9C8A7EE6572D4EF117D5B8119625C94F448475BDA63748DA186AA35977D2DFFB1515465F8E924BB2726A73005EF
Ex : 010001
---
D  : 7BE76B1B6142E8BFBEC8DAB99CB68651E9892B243A164942299626949E300F5EA3E6C67F1B914A80742F3787AFA2EA932310AD27C62331204E8FB7BD49370ECD79D6471FA5B09910C393AF777C14C6F886344A2828A2FF646251DE554BB2646211E73B6893AD19DB63EB9E45853EA521717690DDE19E156739FA0433E7A10F0FFBE7119DC413720BC0CDBD474FA6B97F5C029F7EC53788680A62A968CCD0261A36B5CF576294E96A06A294845C9CDDB857BB5C8403B245AF258EF7A5F009CED7A21D0CB81324C3FBFD5FBF7A92D97240CC10315356023174CDE72820729BED93C1ABADC0B2747122B7D9BA56A9BB28063F5471D195860C18A20D331AB6FA5AA9
P  : CF27D21DB2CDBB02F53D8B782E356EC701A3260A8F465CCD3095B90B46A41F5E18FE8419153177BF749C17CCDE554EAEC99D790CF47163A3765E68BC89CAAF92E383B2AA5ACC832EE2234AFAA0350B4DBBFB9616C5322A51C5ABF143D7E275F08629C8DBE1901B6E314963C70299BE338A629577F287435EBF9027B100389FCD
Q  : C9D12AE0742E904DDB397F449D1CF594F6C4C4352B85814CC98833806D2632FF08AAA576B8CBE9B485F9FFE940B06AC139AA89160574F83E8A915B394CA38E663C8609326E941D414CBD016B395F2263A19F10DE16D498B6BEF4AC2B2FE9BE80754628ECA96681EA95B523151AB9BCBA0A3319956A3663F41FDEA4FD7C3A68AB
DP : 74F4CD8B58ED105DAE2A2E390F15B9D27F99261C26221AB8FA6A3DCC20F8FE80B8E9D198FBBF2F1597F79CF45CBE9B2AD1C7A79569D92EE1162E5D41BD260314928143792CC474781ED2C03D5A0038BE8D98907790A42F0275F10AC93BF4AE93BA9B92BC99D02BBC7DF52A712C85B2BE14AE6E270775D8D280A319D5B403442D
DQ : BDB17D3BBBF8886AA5C4457B98B1BFA364CF4E1D2BEB30BD9C3009388D5F7A4F7D35E890CEE1DBA972C4A965F507DD500183E996694AA88B2073BFEAFBBE3FFA98A8E3BC2373D48BAC357B3FED8D1E25C7A45B96649F2F6B95D12482F36621495CF1B545BD743C68E28E7F8B36B39E50BF858866888ED7247F5026849C5FCA41
IQ : B0E15D9D6E10515201D64AE43445CCE1F8952EF28AFE4CC6784FCFFF7F7EEB86352B56158C6AD63DEF2FC952ECFA8D6DB0FC3D2D4C805E628BA5D540DFC8E102B35EF56B6830B2CDDFFA5FD5E5C514080DDD0DFBCA029F172D7899F6F2E8CC7FBC701B40FF574AD961FAFE2CAC573F78B28850E48EB5DF01349CC679C21123E6
DataToDecrypt     : 4B57F0ABAAAC196EAEE3953B92FABB2743BF3FEA3D9595912A0E5E6EB770EBD42A5047479FB5A514810197A5C29CE008BB95740925A53DDD6B31F0BCEFC1D56E426A659E0D77EA82612FBA9D97E0F9B8E4A6EF92EDA22875776E076467C82C1DCFAA16259B5696B4A5E09B8B5DCF4D2203504C40A624CE093060DEF78A7C73F9EAF145E9853303692E8867AE41E6E23C6551782BECA63F305C59E77DBF814B0B2EE2CA9A08732E291FC077D637B5B984C9744EB411AF092DAB5486F4FE43901B27B260A5BE6569761152716A8D9A445B5F4F573BFEFE0CB7E5E9D5EE6D231C28CC798FFF398C15A8AA263BF5484CB06FB76421DFF9F5ABD286FAE7E2EADD8F83

Decrypted plaintext: DER形式の鍵ファイルを C#で読み込んで RSAの暗号化と復号化の サンプル

rem C#側で「公開鍵」で暗号化したデータを下記のコマンドラインで「秘密鍵」で RSA復号化できる
openssl rsautl -decrypt -inkey private-key.pem -in test.enc -out test_decode.txt

rem C#側で「公開鍵」で暗号化したデータを下記のコマンドラインで「秘密鍵」で RSA復号化できる
openssl rsa -in PRIVATEKEY.msblob -inform msblob -out private-cs-key.der -outform DERopenssl rsautl -decrypt -inkey private-cs-key.der -keyform DER -in test_cs.enc -out decode_test_cs.txt

openssl rsa -in PRIVATEKEY.msblob -inform msblob -out private-cs-key.pem
openssl rsautl -decrypt -inkey private-cs-key.pem -in test_cs.enc -out decode_test_cs.txt


● Windowsの RSA暗号で使用する PUBLICKEYBLOBと OpenSSLの DER形式の関係

 MSBLOB形式と DER形式では各データのバイト列を逆順にします。PRIVATEKEYBLOBも同様。

2.4.1 PUBLICKEYBLOB

・Windowsの RSA暗号で使用する PUBLICKEYBLOBと OpenSSLの DER形式の関係
Windowsの RSA暗号で使用する PUBLICKEYBLOBと OpenSSLの DER形式の関係
 modulus部分
 MSBLOB形式と DER形式では各データのバイト列を逆順にします。
 B2 E4 58 ..... D2 BF 8Fとなります。(符号無し)

・Windowsの RSA暗号で使用する PUBLICKEYBLOBと OpenSSLの DER形式の関係
Windowsの RSA暗号で使用する PUBLICKEYBLOBと OpenSSLの DER形式の関係
 modulus部分
 MSBLOB形式と DER形式では各データのバイト列を逆順にします。
 00 B2 E4 58 ..... D2 BF 8Fとなります。(符号有り)

 なお、DER形式で使用している ASN.1データ構造の数値は「符号付き」を想定しているので、RSAで使用する数値の先頭ビットが 1の場合は「負数」と解釈されない様に 00の 1バイトを先頭に追加します。

・Windowsの RSA暗号で使用する PUBLICKEYBLOBと OpenSSLの DER形式の関係
Windowsの RSA暗号で使用する PUBLICKEYBLOBと OpenSSLの DER形式の関係
 publicExponent部分
 MSBLOB形式と DER形式では各データのバイト列を逆順にします。

・Windowsの RSA暗号で使用する PUBLICKEYBLOBと OpenSSLの DER形式の関係
Windowsの RSA暗号で使用する PUBLICKEYBLOBと OpenSSLの DER形式の関係
 publicExponent部分
 MSBLOB形式と DER形式では各データのバイト列を逆順にします。
 なお、RSA暗号方式の public Exponent部分は常に 65537(0x10001)です。

・Windowsの RSA暗号で使用する PUBLICKEYBLOBと OpenSSLの DER形式の関係
Windowsの RSA暗号で使用する PUBLICKEYBLOBと OpenSSLの DER形式の関係
 MS RSA BLOB RSA1 PUBLICKEYBLOB

・Windowsの RSA暗号で使用する PUBLICKEYBLOBと OpenSSLの DER形式の関係
Windowsの RSA暗号で使用する PUBLICKEYBLOBと OpenSSLの DER形式の関係
 0x00000800 = 0x0800 = 2048 = 鍵長 2048 bits長



Tags: [Windows], [無人インストール]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

OpenSSLコマンドを使って RSA暗号処理する方法
OpenSSLコマンドを使って RSA暗号処理する方法

  OpenSSLコマンドで公開鍵暗号方式の RSA暗号処理する方法を解説

Java言語で RSA暗号処理する方法、OpenSSLとの連携方法、Androidにも対応
Java言語で RSA暗号処理する方法、OpenSSLとの連携方法、Androidにも対応

  Java言語で公開鍵暗号方式の RSA暗号処理と OpenSSLと連携する方法を解説

PHP言語で RSA暗号処理する方法、OpenSSLとの連携方法
PHP言語で RSA暗号処理する方法、OpenSSLとの連携方法

  PHP言語で 公開鍵暗号方式の RSA暗号処理と OpenSSLと連携する方法を解説

GO言語で RSA暗号処理する方法、OpenSSLとの連携方法
GO言語で RSA暗号処理する方法、OpenSSLとの連携方法

  GO言語で 公開鍵暗号方式の RSA暗号処理と OpenSSLと連携する方法を解説

Visual Studio 2013の C# .NETで Hash計算処理をする方法のサンプルプログラム
Visual Studio 2013の C# .NETで Hash計算処理をする方法のサンプルプログラム

  HashAlgorithm.TransformBlockを使用すると巨大ファイル等でハッシュ計算の進行状況の進捗を取得できます

Visual Studio 2013の .NET C#で UTF-8対応 QRコード生成・読取アプリを作成する方法、ZXing.Net QR Codeライブラリを使用
Visual Studio 2013の .NET C#で UTF-8対応 QRコード生成・読取アプリを作成する方法、ZXing.Net QR Codeライブラリを使用

  .NETで UTF-8対応 QRコード作成・解読アプリを作成、ILMergeで dllを exeに合体する方法

C# .NETで ZIPファイル解凍ツール UnZipをソースリスト 1行で自作する方法、Windows .NET専用
C# .NETで ZIPファイル解凍ツール UnZipをソースリスト 1行で自作する方法、Windows .NET専用

  Visual Studio 2013の C# .NET 4.5で ZipFile.ExtractToDirectoryを使い、UnZip解凍ツールを作成

Visual Studio 2013に Windows 10 SDK + UwpDesktopで UWPの機能を素の Windowsアプリから使用
Visual Studio 2013に Windows 10 SDK + UwpDesktopで UWPの機能を素の Windowsアプリから使用

  VS2013に Win 10 SDKをインストールして Uwp Desktopで UWPの機能を従来の Windowsアプリで動かす

Visual Studio 2013の C# .NETで 日本語対応の OCR文字認識アプリを自作する方法
Visual Studio 2013の C# .NETで 日本語対応の OCR文字認識アプリを自作する方法

  オフライン環境で動作可能な 世界各国語対応の OCR文字認識アプリを C# .NETで作成、MS製 OCRライブラリを使用

Visual Studio 2013の C#で日本語対応の手書き文字認識アプリを自作する方法
Visual Studio 2013の C#で日本語対応の手書き文字認識アプリを自作する方法

  オフライン環境で動作する世界各国語対応の手書き文字認識アプリを作成、MS製 手書き認識ライブラリを使用

Open XML SDKを使用して Officeのファイルを C#で自在に操る方法
Open XML SDKを使用して Officeのファイルを C#で自在に操る方法

  Microsoft Officeのファイルをプログラムで生成したり直接中身の読み取りができます

Visual Studioの各バージョンと開発できる .NET Frameworkの各バージョンのまとめ
Visual Studioの各バージョンと開発できる .NET Frameworkの各バージョンのまとめ

  .Microsoft.NET Framework Developer Packの各バージョンのダウンロードまとめ。言語パック等

Windows 10対応 Microsoft Speech使用の音声認識アプリ
Windows 10対応 Microsoft Speech使用の音声認識アプリ

  SpeechRecognizeApp 音声認識エンジンを使用してマイク入力の音声を認識します

Windows 10の音声合成エンジンを使用して入力した文字列を喋る & Waveファイル書き出し
Windows 10の音声合成エンジンを使用して入力した文字列を喋る & Waveファイル書き出し

  SpeechApp Windows 10用 Speech 音声合成 Text-to-Speech TTSのアプリ

Visual Studioの C#や MFC C++用のサンプルアプリのリンク集
Visual Studioの C#や MFC C++用のサンプルアプリのリンク集

  Visual Studioの C#や MFC C++でアプリを作る時の参考資料として

Windowsの Input Method Manager IMEや TSF Text Services Frameworkの公式情報源のまとめ
Windowsの Input Method Manager IMEや TSF Text Services Frameworkの公式情報源のまとめ

  Windowsで IME Input Method Manager関連のアプリを作成する時の情報 ImeTrayもこの辺を必死に読んだ

Visual Studioの C#で開発した .Netアプリの難読化をする方法
Visual Studioの C#で開発した .Netアプリの難読化をする方法

  C#で開発した .Netアプリの難読化は必須事項です、素の状態では簡単に内部を解析されます

Visual Studioの C#で開発した .Netアプリを逆コンパイルして、中身の実装を覗き見る方法
Visual Studioの C#で開発した .Netアプリを逆コンパイルして、中身の実装を覗き見る方法

  C#で開発した .Netアプリは比較的簡単に元のソースコードに戻せます

Visual Studio 2019 Professional v16.4を無人インストールする方法、完全自動でインストール
Visual Studio 2019 Professional v16.4を無人インストールする方法、完全自動でインストール

  VS2019 v16.4を完全オフラインインストール&コンポーネント選択の事前設定で自動インストールする

Visual Studio 2013 Professionalを無人インストールする方法、完全自動でインストール
Visual Studio 2013 Professionalを無人インストールする方法、完全自動でインストール

  VS2013を Update 5適用済みとコンポーネント選択の事前設定でインストール時の手間を省く




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2020 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/software/visual_c_sharp_rsa_encrypt_decrypt/