RSAの暗号化と復号化着陸

  最近同社は、プロジェクトの受け入れ後、顧客情報セキュリティ技術担当者は、いつ着陸その中で、問題をトラブルシューティングするために当社のウェブサイトおよび安全性試験の様々な暗号化の問題を招きました。単純な暗号化はフォアグラウンドMD5暗号化に直接使用することができるならば、暗号化された値をデータベースに追加することができますされていたであろう。しかし、今のプロジェクトでは、パスワードはMD5のバックグラウンドで暗号化され、ユーザーの多くを持っています。これは単にMD5暗号化でフォアグラウンドで、限られた容量、ユーザーが着陸に失敗し、アライメントのパスワードをログインすることができないときに使用されるバックグラウンド値と矛盾MD5暗号化MD5暗号化受信かもしれません。フォアグラウンドの暗号化MD5暗号化を使用して非対称暗号化、復号化の背景を使用して、少なくとも変更を使用するためにこのような行為を比較するだけです。RSA非対称暗号化を使用してオンライン検索情報の後。

https://www.cnblogs.com/amylis_chen/p/6054414.html

フロントエンドコード

 <スクリプトSRC = "http://code.jquery.com/jquery-1.8.3.min.js"> </ SCRIPT>

 <スクリプトSRC = "http://passport.cnblogs.com/scripts/jsencrypt.min.js"> </ SCRIPT>

<スクリプト>

   VaRの暗号化=新JSEncrypt();

    encrypt.setPublicKey(「ツールは、公開鍵を生成するために使用することができる」);
    VAR = UserPwd encrypt.encrypt(入力パスワード); //暗号化されたパスワード

</ SCRIPT>

バックエンドのコード

VaRの公開=「公開鍵は、ツールで生成することができます」

VaRののPrivateKey =「プライベートキーはツールで生成することができます」

=新しい新しいRSACrypto rsaCrypto RSACrypto(のPrivateKey、PUBLICKEY);
UserPwd = rsaCrypto.Decrypt(UserPwd); //パスワードが解読され、パスワードはの値であり、

 

/// <要約>
/// RSA非对称加密
/// </要約>
パブリッククラスRSACrypto
{
プライベートRSACryptoServiceProvider _privateKeyRsaProvider。
プライベートRSACryptoServiceProvider _publicKeyRsaProvider。

公共RSACrypto(文字列のPrivateKey、文字列PUBLICKEY = NULL)
{
場合(!string.IsNullOrEmpty(のPrivateKey))
{
_privateKeyRsaProvider = CreateRsaProviderFromPrivateKey(のPrivateKey)。
}

もし(string.IsNullOrEmpty(公開)!)
{
_publicKeyRsaProvider = CreateRsaProviderFromPublicKey(公開)。
}
}

公共の文字列復号化(文字列の暗号文)
{
場合(_privateKeyRsaProvider == NULL)
{
( "_ privateKeyRsaProviderがnull")新しい例外を投げます。
}
Encoding.UTF8.GetString(_privateKeyRsaProvider.Decrypt(System.Convert.FromBase64String(暗号文)、偽))を返します。
}

公共の文字列を暗号化(文字列テキスト)
{
(_publicKeyRsaProvider == null)の場合は
{
( "_ publicKeyRsaProviderがnull")新しい例外を投げます。
}
())偽_publicKeyRsaProvider.Encrypt(Encoding.UTF8.GetBytes(テキスト)Convert.ToBase64Stringを返します。
}

プライベートRSACryptoServiceProvider CreateRsaProviderFromPrivateKey(文字列のPrivateKey)
{
VAR privateKeyBits = System.Convert.FromBase64String(のPrivateKey)。

)(RSA =新しいRSACryptoServiceProviderました。
)(=新しいRSAParameters RSAparamsました。

使用(BinaryReader binr =新しいBinaryReader(新規のMemoryStream(privateKeyBits)))
{
バイトBT = 0。
USHORT twobytes = 0。
twobytes = binr.ReadUInt16()。
IF(twobytes == 0x8130)
binr.ReadByte();
それ以外の場合(twobytes == 0x8230)
binr.ReadInt16();
他の
新しい例外を投げる(「予期しない値がbinr.ReadUInt16を()読み」);

twobytes = binr.ReadUInt16()。
(!twobytes = 0x0102)があれば
、新たな例外( "予期しないバージョン")を投げます。

BT = binr.ReadByte()。
(!BT = 0x00の)場合には
、新たな例外を投げる( "予期しない値がbinr.ReadByteを()読み");

RSAparams.Modulus = binr.ReadBytes(GetIntegerSize(binr))。
RSAparams.Exponent = binr.ReadBytes(GetIntegerSize(binr))。
RSAparams.D = binr.ReadBytes(GetIntegerSize(binr))。
RSAparams.P = binr.ReadBytes(GetIntegerSize(binr))。
RSAparams.Q = binr.ReadBytes(GetIntegerSize(binr))。
RSAparams.DP = binr.ReadBytes(GetIntegerSize(binr))。
RSAparams.DQ = binr.ReadBytes(GetIntegerSize(binr))。
RSAparams.InverseQ = binr.ReadBytes(GetIntegerSize(binr))。
}

RSA.ImportParameters(RSAparams)。
RSAを返します。
}

プライベートINT GetIntegerSize(BinaryReader binr)
{
バイトBT = 0。
バイトのロー・バイト= 0x00で、
バイトhighbyte = 0x00で、
int型のカウント= 0;
BT = binr.ReadByte()。
(!BT = 0x02の)場合は
0を返します。
BT = binr.ReadByte()。

(BT == 0x81と)場合
= binr.ReadByteを数えます();
そう
であれば(BT == 0x82と)
{
highbyte = binr.ReadByte()。
ロー・バイト= binr.ReadByte()。
バイト[] modint = {ロー・バイト、highbyte、0x00に、0x00の}。
カウント= BitConverter.ToInt32(modint、0);
}

{
カウント= BT。
}

一方、(binr.ReadByte()== 0×00)
{
カウント- = 1;
}
binr.BaseStream.Seek(-1、SeekOrigin.Current)。
リターン・カウント;
}

プライベートRSACryptoServiceProvider CreateRsaProviderFromPublicKey(文字列publicKeyString)
{
PKCS#1 rsaEncryption szOID_RSA_RSA = "1.2.840.113549.1.1.1"の//コードされるOID配列
バイト[] SeqOID = {0x30から、0x0Dを、0x06で、0x09の、0x2A、0x86で、0x48、0x86で、0xF7、0x0Dを、0x01の、0x01で、0x01で、0x05の、0x00を}。
バイト[] x509key。
バイト[]配列=新しいバイト[15]。
int型のx509size。

x509key = Convert.FromBase64String(publicKeyString)。
x509size = x509key.Length。

// --------- ------ ASN.1符号化されたSubjectPublicKeyInfoでブロブを読み取るためにストリームを設定
(MemoryStreamをMEM =新規のMemoryStream(x509key))を使用して、
{
使用(BinaryReader binr =新しいBinaryReader(MEM ))//読みやすいBinaryReaderでメモリストリームをラップ
{
バイトBT = 0;
USHORT twobytes = 0。

twobytes = binr.ReadUInt16()。
IF(twobytes == 0x8130)//データとしてリトルエンディアン順(シーケンスに対する実際のデータの順序は30 81である)を読み込む
binr.ReadByteを(); //事前1バイト
であれば、他の(twobytes == 0x8230)
binr.ReadInt16(); //事前2バイト
ほかの
リターンはnull;

SEQ = binr.ReadBytes(15)。//シーケンスのOIDを読んで
(!CompareBytearrays(配列、SeqOID))場合// OIDのためのシーケンスが正しいことを確認して
、リターンはnull;

twobytes = binr.ReadUInt16()。
もし(twobytes == 0x8103)//データは、わずかエンディアン(ビット列の実際のデータの順序が03 81である)読み
binr.ReadByteを(); //事前1バイト
であれば、他の(twobytes == 0x8203)
binr.ReadInt16(); //事前2バイト
ほかの
リターンはnull;

BT = binr.ReadByte()。
(!BT = 0x00の)// NULLバイトの次の予想される場合は
nullを返します。

twobytes = binr.ReadUInt16()。
IF(twobytes == 0x8130)//データとしてリトルエンディアン順(シーケンスに対する実際のデータの順序は30 81である)を読み込む
binr.ReadByteを(); //事前1バイト
であれば、他の(twobytes == 0x8230)
binr.ReadInt16(); //事前2バイト
ほかの
リターンはnull;

twobytes = binr.ReadUInt16()。
バイトのロー・バイト= 0x00で、
バイトhighbyte = 0x00で、

(twobytes == 0x8102)//データ(整数の実際のデータの順序は02 81である)などのリトルエンディアン順を読み取る場合に
ロー・バイト= binr.ReadByte()。モジュラスのバイトである//読み取る次バイト
そうであれば(twobytes == 0x8202)
{
highbyte = binr.ReadByte()。//事前2バイト
ロー・バイト= binr.ReadByte()。
}
他の
リターンはnull;
バイト[] modint = {ロー・バイト、highbyte、0x00に、0x00の}。ASN.1キーはビッグエンディアン順を使用しているため、//逆のバイト順
int型modsize = BitConverter.ToInt32(modint、0);

INT firstbyte = binr.PeekChar()。
IF(firstbyte == 0×00)
弾性率の最初のバイト(最上位)がゼロである場合{//、それに含まれていない
binr.ReadByteを(); //このNULLバイトのスキップ
modsize - = 1; // 1モジュラスバッファサイズを小さく
}

バイト[]モジュラス=のbinr.ReadBytes(modsize)。//モジュラスを読み込んだバイト

(!binr.ReadByte()= 0x02の)場合は、//指数データのための整数期待
リターンはnullを。
INT expbytes =(INT)binr.ReadByte(); //のみ(すべての有用な値のために)実際の指数データの1つのバイトを必要とするべきである
[]指数= binr.ReadBytes(expbytesを)バイト;

// ------- ----- RSACryptoServiceProviderインスタンスを作成し、公開鍵で初期化
)RSACryptoServiceProvider RSA =新しいRSACryptoServiceProvider(;
RSAParameters RSAKeyInfo =新しいRSAParameters();
RSAKeyInfo.Modulus =弾性率;
RSAKeyInfo.Exponent =指数;
RSA.ImportParameters(RSAKeyInfo)。

RSAを返します。
}

}
}

プライベートブールCompareBytearrays(バイト[]、バイト[] b)は
{
(a.Length =のb.length!)があれば
falseを返します。
int型私= 0;
foreachの(にバイトc)
{
IF(!C = B [i])と
偽を返します。
I ++;
}
trueを返します。
}
}

RSA鍵ペアの生成ツール--------- http://web.chacuo.net/netrsakeypair

公開鍵と秘密鍵を生成するために、PKCS#1を選択してください

 

おすすめ

転載: www.cnblogs.com/w1-y2-q5/p/11695070.html