最近いつも会っドッキングおよびその他の項目、あなたは通常、暗号化されたパラメータを復号化するために設計されたAPIを呼び出したときのために、JAVAを使用して他のプロジェクト。あなたがC#で再び暗号化アルゴリズムの反対側を必要とするときです。
直接コードに。
ジャワ
プライベート静的バイト[] IV = {1,2,3,4,5,6,7,8}。 パブリック静的文字列encryptDES(文字列encryptString、列encryptKey)が例外をスロー{ // IvParameterSpec zeroIv =新しいIvParameterSpec(新しいバイト[8])。 IvParameterSpec zeroIv =新しいIvParameterSpec(IV); SecretKeySpecキー=新しいSecretKeySpec(encryptKey.getBytes( "UTF-8")、 "DES")。 暗号暗号= Cipher.getInstance( "DES / CBC / PKCS5Padding"変換)。 cipher.init(Cipher.ENCRYPT_MODE、キー、zeroIv)。 バイト[]はEncryptedData = cipher.doFinal(encryptString.getBytes( "UTF-8")); Base64_BAK.encode(はEncryptedData)を返します。 } パブリック静的文字列decryptDES(文字列decryptString、列decryptKey)が例外をスロー{ バイト[] byteMi =新しいBase64_BAK()デコード(decryptString)。 IvParameterSpec zeroIv =新しいIvParameterSpec(IV); // IvParameterSpec zeroIv =新しいIvParameterSpec(新しいバイト[8])。 SecretKeySpecキー=新しいSecretKeySpec(decryptKey.getBytes( "UTF-8")、 "DES")。 暗号暗号= Cipher.getInstance( "DES / CBC / PKCS5Padding"変換)。 cipher.init(Cipher.DECRYPT_MODE、キー、zeroIv)。 バイトdecryptedData [] = cipher.doFinal(byteMi)。 文字列retrdecryptedData =新しいString(decryptedData、 "UTF-8"); retrdecryptedDataを返します。 }
文字コードをエンコードするために、
クラスBase64_BAK { プライベート静的最終CHAR [] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /" toCharArray()。 / ** *データ[]进行编码 * @paramデータ * @return * / パブリック静的文字エンコード(バイト[]データ){ int型開始= 0。 int型のlen = data.length。 StringBufferのBUF =新規のStringBuffer(data.length * 3/2)。 int型エンド= LEN - 3。 私は=起動int型。 INT、N = 0。 ながら(iは=終わり<){ int型、D =((((INT)データ[I])&0x0ff)<< 16) | ((((INT)のデータは[I 1 +])&0x0ff)<< 8) int型、D =((((INT)データ[I])&0x0ff)<< | (((INT)のデータは[I 2 +])&0x0ff)。 buf.append(legalChars [(D >> 18)&63])。 buf.append(legalChars [(D >> 12)&63])。 buf.append(legalChars [(D >> 6)&63])。 buf.append(legalChars [D&63])。 I + = 3; IF(N ++> = 14){ n = 0です。 buf.append(」「); } } もし(I == + LENを開始- 2){ | ((((INT)データ[I + 1])&255)<< 8)。 buf.append(legalChars [(D >> 18)&63])。 buf.append(legalChars [(D >> 12)&63])。 buf.append(legalChars [(D >> 6)&63])。 buf.append( "=")。 }そうなら(I == + LEN開始- 1){ int型、D =(((INT)データ[I])&0x0ff)<< 16。 buf.append(legalChars [(D >> 18)&63])。 buf.append(legalChars [(D >> 12)&63])。 buf.append( "=="); } )(buf.toStringを返します。 } プライベート静的INTデコード(チャーC){ それ以外の場合(C> = '' & ; 65 - ((int型)C)を返します リターン((INT)C) - 97 + 26。 他の場合(C> = '0' && C <= '9') リターン((INT)C) - 48 + 26 + 26。 他の スイッチ(C){ ケース'+': リターン62。 ケース'/': リターン63; ケース'=': リターン0; デフォルト: 新しいのRuntimeExceptionをスロー( "予期せぬコード:" + C)。 } } / ** *新しいバイト配列に指定したBase64でエンコードされた文字列をデコードします。バイトの 復号されたデータを保持*の配列が返されます。 * / パブリック静的バイト[]デコード(文字列S){ ByteArrayOutputStream BOS =新しいByteArrayOutputStream(); {試みる デコード(S、BOS)を、 }キャッチ(IOExceptionを電子){ )(新規のRuntimeExceptionを投げます。 } バイト[] decodedBytes = bos.toByteArray()。 {試みる bos.closeを(); BOS = NULL; }キャッチ(のIOExceptionのEX){ System.err.println( "BASE64のデコード中にエラーが:" + ex.toString())。 } decodedBytesを返します。 } プライベート静的ボイドデコード(文字列sのOutputStream OSは)にIOExceptionが{スロー I = 0 int型。 INT LEN = s.length()。 一方、(TRUE){ (私がlen && <s.charAt(I)<= '「)しながら、 Iを++。 (私== lenが)もし 破ります。 INTトリ=(デコード(s.charAt(I))<< 18) +(デコード(s.charAt(I + 1))<< 12) +(デコード(s.charAt(I + 2))<< 6) +(デコード(s.charAt(I + 3)))。 os.write((トリ>> 16)&255); もし(s.charAt(I + 2)== '=') ブレーク。 os.write((トリ>> 8)&255); もし(s.charAt(I + 3)== '=') ブレーク。 os.write(トライ&255)。 I + = 4。 } }
次のように暗号化と復号化アルゴリズムに対応するC#があります
静的文字エンコード(バイト[]データ) { int型の開始= 0。 int型のlen = data.Length。 StringBuilderのBUF =新規のStringBuilder(data.Length * 3/2)。 VaRのlegalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /" ToCharArray(); int型エンド= LEN - 3。 私は=起動int型。 INT、N = 0。 (iは=端を<)、一方 { int型、D =((((INT)データ[I])&0x0ff)<< 16) | ((((INT)のデータは[I 1 +])&0x0ff)<< 8) | (((INT)のデータは[I 2 +])&0x0ff)。 buf.Append(legalChars [(D >> 18)&63])。 buf.Append(legalChars [(D >> 12)&63])。 buf.Append(legalChars [(D >> 6)&63])。 buf.Append(legalChars [D&63])。 I + = 3; IF(N ++> = 14) { n = 0です。 buf.Append(」「); } } もし(I == + LENを開始- 2) { int型、D =((((INT)データ[I])&0x0ff)<< 16) | ((((INT)データ[I + 1])&255)<< 8)。 buf.Append(legalChars [(D >> 18)&63])。 buf.Append(legalChars [(D >> 12)& buf.Append(legalChars [(D >> 6)&63])。 buf.Append( "=")。 そうであれば(私== + LEN開始- 1) { int型、D =(((INT)データ[I])&0x0ff)<< 16。 buf.Append(legalChars [(D >> 18)&63])。 buf.Append(legalChars [(D >> 12)&63])。 buf.Append( "=="); } )(buf.ToStringを返します。 } プライベート静的文字列を暗号化(文字列str、文字列のsKey、バイト[] IV) { DESCryptoServiceProvider DES =新しいDESCryptoServiceProvider()。 バイト[] inputByteArray = Encoding.Default.GetBytes(STR)。 des.Key = ASCIIEncoding.ASCII。 //バイト[] IV = {1、2、3、4、5、6、7、8}。 DES.IV = IV; //初始化向量 MemoryStreamをミリ秒=新規のMemoryStream()。 CryptoStream CS =新しいCryptoStream(MS、des.CreateEncryptor()、CryptoStreamMode.Write)。 cs.Write(inputByteArray、0、inputByteArray.Length)。 cs.FlushFinalBlock(); VaRのRETB =エンコード(ms.ToArray())。 RETBを返します。 } プライベート静的文字列復号化(ストリングpToDecrypt、ストリングのsKey、バイト[] IV) { DESCryptoServiceProvider DES =新しいDESCryptoServiceProvider()。 バイト[] inputByteArray = Convert.FromBase64String(pToDecrypt)。 //バイト[] IV = {1、2、3、4、5、6、7、8}。 des.Key = ASCIIEncoding.ASCII.GetBytes(のsKey)。 IV = DES.IV; MemoryStreamをMemoryStreamを新しい新しいMS =(); CryptoStream新しい新しいCSはCryptoStream(MS、des.CreateDecryptor()、CryptoStreamMode.Writeを)=; cs.Write(inputByteArray、0、inputByteArray.Length); // 2ならキー時間が同じではない、例外トリガすることができ、このステップ cs.FlushFinalBlockを(); System.Text.Encoding.Default.GetString(ms.ToArray())を返します; }
Javaの暗号化と復号化アルゴリズム
パブリック静的文字列decryptDES(文字列decryptString、列decryptKey)が例外をスロー{ ストリングafterDecryptString = NULL; バイト[] byteMi =新たにBase64()デコード(decryptString)。 {しようと SecretKeySpecキー=新しいSecretKeySpec(decryptKey.getBytes()、 "DES"); 暗号暗号= Cipher.getInstance( "DES")。 cipher.init(キー2)。 バイト[] decryptData = cipher.doFinal(byteMi)。 afterDecryptString =新しい文字列(decryptData、 "UTF-8"); }キャッチ(例外e){ log.error( "decryptDESエラー"、E)。 Eを投げます。 } 戻りafterDecryptString。
C#コード
パブリック静的文字列復号化(ストリングpToDecrypt、ストリングのsKey) { // VAR inputByteArray = ASCIIEncoding.ASCII.GetBytes(pToDecrypt)。 バイト[] inputByteArray = Convert.FromBase64String(pToDecrypt)。 使用(DESCryptoServiceProvider DES =新しいDESCryptoServiceProvider()){ //des.Padding = PaddingMode.PKCS7。 des.Mode = CipherMode.ECB。 des.Key = ASCIIEncoding.ASCII.GetBytes(のsKey)。 DES.IV = ASCIIEncoding.ASCII.GetBytes(のsKey)。 System.IO.MemoryStream MS =新しいSystem.IO.MemoryStream()。 使用(CryptoStream CS =新しいCryptoStream(MS、des.CreateDecryptor()、CryptoStreamMode.Write)) { cs.Write(inputByteArray、0、inputByteArray.Length)。 cs.FlushFinalBlock(); cs.Close(); } 文字列STR = Encoding.UTF8.GetString(ms.ToArray())。 ms.Close(); STRを返します。 } }