DES暗号化アルゴリズムによるJavaソースの保護


要旨:本文はまずJavaソースコードが暗号化する必要がある原因を分析し、DESアルゴリズムとJavaパスワード体系とJavaパスワード拡張を簡単に紹介し、最後にDES暗号アルゴリズムを利用してJavaソースコードを保護する方法と手順を説明した.
 
 キーワードJava暗号化DESアルゴリズム
 
Java言語はネットワークプログラミングに非常に適した言語であり、その基本構造はC++と極めて似ているが、C/C++のポインタなどの内容を捨て、Smalltalk、C++のオブジェクト向けのプログラミング思想を吸収している.単純性、ロバスト性、移植性、ダイナミック性などの特徴があります.これらの特徴はJavaをプラットフォームにまたがる応用開発の規範となり、世界に広く伝わっている.
 
Javaソースを暗号化する理由
 
JavaソースコードはコンパイルされてからJVMで実行されます.JVMインタフェースは完全に透明であるため、Javaクラスファイルは逆コンパイラでソースコードに簡単に再変換できます.そのため、すべてのアルゴリズム、クラスファイルなどはソースコードの形式で公開され、ソフトウェアが保護されないようにすることができ、財産権を保護するために、一般的に以下のいくつかの方法がある.
 
(1)「ファジイ」クラスのファイルは,反コンパイラがソースファイルを反コンパイルする難しさを増す.ただし、これらのファジイクラスファイルを処理できるように、逆コンパイラを変更することができます.したがって、コードのセキュリティを保証するために「ファジイクラスファイル」に依存するだけでは不十分です.
 
(2)PGP(Pretty Good Privacy)やGPG(GNU Privacy Guard)などのソースファイルを暗号化するポピュラーな暗号化ツール.この場合、エンドユーザは、アプリケーションを実行する前に復号化を行わなければならない.しかし,復号化後,エンドユーザには暗号化されていないクラスファイルがあり,これは事前に暗号化されていないことと変わらない.
 
(3)クラスファイルを暗号化し、実行中にJVMがカスタムクラスローダでクラスファイルを復号する.Java実行時にバイトコードをロードするメカニズムは、バイトコードを変更できることを意味する.JVMはクラスファイルを読み込むたびに、実行中のJVMに新しいクラスを読み込むClassLoaderというオブジェクトが必要です.JVMはClassLoaderにロードするクラス(java.lang.Objectなど)の名前を含む文字列を与え、ClassLoaderがクラスファイルを見つけて元のデータをロードし、Classオブジェクトに変換します.
 
ユーザがダウンロードしたのは暗号化されたクラスファイルであり,暗号化されたクラスファイルが読み込まれたときに復号されるため,インスタント復号器と見なすことができる.復号されたバイトコードファイルはファイルシステムに保存されないため、盗難者は復号されたコードを得ることが難しい.
元のバイトコードをClassオブジェクトに変換するプロセスは完全にシステムが担当するため、カスタムClassLoaderオブジェクトを作成するのは難しくありません.元のデータを取得してから、復号を含む変換を行うだけです.
 
Javaパスワード体系とJavaパスワード拡張
 
Java暗号体系(JCA)とJava暗号拡張(JCE)の設計目的は、Javaに実装に関係のない暗号化関数APIを提供することである.これらはすべてfactoryメソッドでクラスのインスタンスを作成し、実際の暗号化関数をプロバイダが指定した最下位エンジンに委任し、エンジンではクラスにサービスプロバイダインタフェースを提供してJavaでデータの暗号化/復号化を実現し、その内蔵JCE(Java暗号化拡張)を使用して実現される.Java開発ツールセット1.1は、デジタル署名と情報要約を含む暗号化機能を実現するために、サプライヤーベースの新しい柔軟なアプリケーションプログラミングインターフェースを発売した.Javaパスワードアーキテクチャは、ハードウェアとソフトウェアの実装をサポートしながら、ベンダーの相互運用をサポートします.
 
Java暗号学構造設計は2つの原則に従う.
(1)アルゴリズムの独立性と信頼性.
(2)実現の独立性と相互作用性.
 
アルゴリズムの独立性は,暗号サービスクラスを定義することによって得られる.ユーザは、暗号アルゴリズムの概念を理解するだけで、これらの概念をどのように実現するかに関心を持つ必要はありません.実装の独立性と相互作用性は、暗号サービスプロバイダによって実現される.暗号サービスプロバイダは、1つまたは複数の暗号サービスを実装する1つまたは複数のパッケージである.ソフトウェア開発者は一定のインタフェースに基づいて、各種アルゴリズムを実現した後、1つのプロバイダにパッケージ化し、ユーザーは異なるプロバイダをインストールすることができる.プロバイダをインストールして構成します.プロバイダを含むZIPファイルとJARファイルをCLASSSPATHの下に置き、Javaセキュリティプロパティファイルを編集してプロバイダを定義します.Java環境Sunバージョンを実行すると、デフォルトのプロバイダSunが提供されます.
 
次に、DESアルゴリズムおよびDESアルゴリズムを使用してクラスファイルを暗号化および復号する方法について説明します.
DESアルゴリズムの概要
DES(Data Encryption Standard)は、最も早く発明され、最も広く使用されているパケット対称暗号化アルゴリズムである.DESアルゴリズムのエントリパラメータは,Key,Data,Modeの3つである.ここで、Keyは8バイト64ビットであり、DESアルゴリズムの作業鍵である.Dataも8バイト64ビットで、暗号化または復号化されるデータである.ModeはDESの動作方法で、暗号化または復号化の2つがあります.
 
DESアルゴリズムのワークフローは以下の通りである:Modeが暗号化モードである場合、Keyを用いてデータDataを暗号化し、Dataの暗号形式(64ビット)をDESの出力結果として生成する.Modeが復号モードであれば、Keyを用いて暗号形式のデータDataを復号し、DESの出力結果としてDataの符号形式(64ビット)に復元する.通信ネットワークの両端において、双方が合意したKeyは、通信のソースポイントでKeyでコアデータをDES暗号化し、その後、暗号形式で公衆通信網(例えば電話網)で通信ネットワークの終点に伝送され、データが目的地に到着した後、同じKeyで暗号データを復号し、暗号形式のコアデータを再現する.これにより、コアデータが共通通信網で伝送される安全性と信頼性が保証される.
定期的に通信ネットワークのソースと宛先で同時に新しいKeyを変更することで、データの機密性をさらに向上させることができる.
DESアルゴリズムで暗号化するには
(1)セキュリティ鍵を生成する.データを暗号化または復号化する前に鍵が必要です.鍵は、暗号化されたアプリケーションとともに発行されるデータであり、鍵コードは以下に示す.
【鍵コードを生成する】
//                
SecureRandom sr = new SecureRandom();   
//       DES      KeyGenerator     
KeyGenerator kg = KeyGenerator.getInstance ("DES" );   
Kg.init (sr);   
//        
Secret Key key = kg.generateKey();   
//                ,  key Filename          
Util.writeFile (key Filename, key.getEncoded () );   

 
 
 
 (2)データを暗号化する.鍵が得られたら、次にデータを暗号化することができます.以下に示す.
【元のデータを鍵で暗号化する】
//                
SecureRandom sr = new SecureRandom();   
//     key Filename          
Byte rawKeyData = Util.readFile (key Filename);   
//          DESKeySpec     
DESKeySpec dks = new DESKeySpec (rawKeyData);   
//         ,     DESKeySpec   Secret Key     
SecretKeyFactory key Factory = SecretKeyFactory.getInstance("DES" );   
Secret Key key = keyFactory.generateSecret( dks );   
// Cipher             
Cipher cipher = Cipher.getInstance( "DES" );   
//       Cipher     
cipher.init( Cipher.ENCRYPT_MODE, key, sr );   
//                   
Byte data = Util.readFile (filename);   
//          
Byte encryptedClassData = cipher.doFinal(data );   
//         ,        。    
Util.writeFile( filename, encryptedClassData );   

 
 
 
 (3)データを復号する.暗号化されたプログラムを実行すると、ClassLoaderはクラスファイルを分析して復号します.操作手順は以下の通りです.
【鍵でデータを復号する】
//                
SecureRandom sr = new SecureRandom();   
//                  
Byte rawKeyData = Util.readFile( keyFilename );   
//     DESKeySpec     
DESKeySpec dks = new DESKeySpec (rawKeyData);   
//         ,     DESKeySpec     Secret Key      
SecretKeyFactory key Factory = SecretKeyFactory.getInstance( "DES" );   
SecretKey key = keyFactory.generateSecret( dks );   
// Cipher             
Cipher cipher = Cipher.getInstance( "DES" );   
//       Cipher     
Cipher.init( Cipher.DECRYPT_MODE, key, sr );   
//             
Byte encrypted Data = Util.readFile (Filename);   
//         
Byte decryptedData = cipher.doFinal( encryptedData );   
//                   。   

 
 上記のコードをカスタムクラスローダと組み合わせると、復号しながら実行でき、ソースコードを保護する役割を果たします.
 
終わりの言葉
暗号化/復号化はデータ伝送においてデータの安全性と完全性を保証する一般的な方法であり、Java言語はそのプラットフォームに関係なくインターネット上の応用が非常に広範である.DESアルゴリズムを使用してJavaソースコードを暗号化することで、ソフトウェアの財産権をある程度保護することができます.