サーバー上の一部のデータを暗号化したいので、誰かがデータベースとコードベースにアクセスした場合、秘密のデータが危険にさらされることはありません。
これを行うには、楕円曲線暗号を使用するのが良い方法のようです。
Bouncy Castleでこれを行う方法を知りたいですか? 私はググっていくつかのブログ投稿を読みましたが、それらは文字列とは関係のないキーを生成し、パスワードでそれを実装する方法がわかりません。さらに、間違いを犯したくありません.
本質的に私はこのようなものが欲しいです:
var privateKey = GetPrivateKey("secretpassword");
var publicKey = GetPublicKey(privateKey);
string data = "secret data";
var encryptedData = encryptData(publicKey, data);
string data2 = unencryptData(privateKey, data);
Assert.AreEqual(data, data2);
これは進行中の私の現在の作業です:
string password = "n55xSMb7J7n7K8zBRn"; // this will not be hardcoded in the application. It will come from a password prompt
byte[] salt = ASCIIEncoding.UTF8.GetBytes(password + password);
int iterations = 5;
int keySizeInBits = 32;
Pkcs5S2ParametersGenerator generator = new Pkcs5S2ParametersGenerator(new Sha256Digest());
generator.Init(PbeParametersGenerator.Pkcs5PasswordToUtf8Bytes(password.ToCharArray()), salt, iterations);
KeyParameter key = (KeyParameter)generator.GenerateDerivedMacParameters(keySizeInBits);
byte[] k = key.GetKey();
X9ECParameters ecP = Org.BouncyCastle.Asn1.Sec.SecNamedCurves.GetByName("secp256k1");
ECDomainParameters ecSpec = new ECDomainParameters(ecP.Curve, ecP.G, ecP.N, ecP.H, ecP.GetSeed());
IAsymmetricCipherKeyPairGenerator g = GeneratorUtilities.GetKeyPairGenerator("ECDSA");
g.Init(new ECKeyGenerationParameters(ecSpec, new SecureRandom(k)));
AsymmetricCipherKeyPair aKeyPair = g.GenerateKeyPair();
AsymmetricKeyParameter privateK = aKeyPair.Private;
AsymmetricKeyParameter publicK = aKeyPair.Public;