2つのJava、C#のターンの暗号化と復号化アルゴリズムを共有します

最近いつも会っドッキングおよびその他の項目、あなたは通常、暗号化されたパラメータを復号化するために設計された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を返します。
            } 
        }

  

 

おすすめ

転載: www.cnblogs.com/Playfunny/p/11428934.html