9.72 ENCRYPT

LANSA

9.72 ENCRYPT


Þ 注:組み込み関数の規則

テキスト文字列を暗号化します。

この組み込み関数と対で使用するDECRYPT組み込み関数は、暗号化されたテキスト文字列を解読します。

警告:このバージョン(LANSA V11 SP4)以降、暗号化にブランクのキーは使用されません。キー引数がすべてブランクで渡された場合、生成されたキーが代わりに使用されます。V11 SP4より古いバージョンでは、暗号化にすべてスペースのキーが使用されます。

各製品の対応

LANSA/AD

使用可 

Visual LANSA for Windows

使用可 

Visual LANSA for Linux

使用可 

引数

番号

タイプ

必須/任意

記述 

最小長

最大長

最小小数桁数

最大小数桁数

1

u

必須

暗号化するテキスト

8

無制限

 

 

2

N

必須

暗号化するテキストの長さ

この長さ引数の値は、8の倍数でなければなりません。

この引数には、第1引数(暗号化するテキスト)の長さより大きい値を指定することはできません。

1

11

0

0

3

u

任意

暗号化に使用するキー

暗号化用のキーを指定しない場合、キーが生成され戻されます。

暗号化に使用したキーは保存して、DECRYPT組み込み関数に指定する必要があります。

現在の暗号化は16バイト/128ビット・キーを使用します。最後の16バイトは今後の使用に備えて予約されています。

Unicodeフィールド・タイプが使用されると、UTF-8に変換され、32バイトに切り捨てられます。キーが指定されず、戻り値3がUnicodeフィールド・タイプの場合は、Unicodeキーが生成されます。このキーはUTF-8に変換され、32バイトに切り捨てられます。

もしくは、Unicodeフィールドを使用したキーを自動的に生成することも可能ですが、これには空の文字列が設定されます。

16

32

 

 

4

A

任意

16進数で保管された、暗号化されたテキスト

YES = 16進数形式の暗号化されたテキストを戻す
NO = バイナリー形式の暗号化されたテキストを戻す

デフォルト値はNOです。

2

3

 

 

戻り値

番号

タイプ

必須/任意

記述

最小長

最大長

最小小数桁数

最大小数桁数

1

A

必須

戻される暗号化されたテキスト

8

無制限

 

 

2

A

任意

戻りコード

OK = アクションが完了した

ER = エラーが発生した

2

2

 

 

3

u

任意

キー引数の指定がない場合の暗号化に使用されたキー

16

32

 

 

技術ノート

·         暗号ブロック暗号化アルゴリズムでは、暗号化と復号化は必ず8桁のブロックで行われます。したがって、暗号化する時の実際の値は8の倍数の長さにする必要があります。

·         暗号化アルゴリズムにより暗号化され戻されたデータはバイナリー・データで、あらゆる値を含めることができます。このようにして暗号化されたデータを使用する場合や環境間で受け渡しする場合は、コード・ページ変換(例: データベース・マネージャー、コミュニケーション・リンクなど)が行われることがあります。またCRやLF、バイナリー・ゼロなどの特殊文字は各種問題(例:HTMLやXMLドキュメント、文字列処理、ストリーム・ファイルなど)の原因となる場合があり、問題が多いことがわかっています。したがって、暗号化されたデータは16進数のフォーマットで物理的に保管することをお勧めします。

·         Unicodeフィールドは暗号化される前にUTF-8に変換されます。これにより、Unicodeフィールドがあるプラフォームで暗号化され、別のプラットフォームで復号化できるようになります。またこれにより、暗号の長さ(引数2)を、暗号化されるテキスト(引数1)の長さの3倍にすることができます。また結果を16進数で保存する場合は、更に倍のサイズにできます。ですから、500文字のNVarcharがあったとすると、暗号化の長さは1500、戻された暗号化されたテキストは3000になります。ただし、実際にはこのような割合で長さを使用すると、データが失われてしまう恐れがあるので、注意してください。

次の2つのRSMLサブルーチンは、汎用的な暗号化技術を使って、最大16文字長のあらゆる情報を暗号化します。  

例えば、EXECUTE ENCRYPT (#KEY #PROD_NUM #PROD_ENC)では、#PROD_NUM(10文字)を暗号化して、#PROD_ENC(32文字)を生成します。

サブルーチンのパラメータの#PROD_NUMは10文字のフィールドですが、結果のフィールドである#PROD_ENCは32文字であることに注意してください。

これは初期バイナリー暗号化では8の倍数の入力が必要だからです(例:サブルーチン実行により10文字の#PROD_NUMは16バイトの長さになるようにブランクが埋め込まれます)。暗号化されたバイナリー・データは16進数で出力されます。したがって長さは32バイトになります。 

後で実行する復号化処理を正常に完了させるため、#PROD_ENCの32バイトすべてを保管する必要があります。

この値を復号化するコードは、EXECUTE DECRYPT (#KEY #PROD_ENC #PROD_NUM)です。

この処理では、32バイトの16進数値はまずバイナリーに変換され復号化された後、16文字で戻されます。

最終的に、このサブルーチンは復号化された値の右側を切り捨てて10文字にして#PROD_NUMに値を入れます。

指定のキーを用いて値を暗号化(ENCRYPT)し、暗号化された値を32バイトの16進数で戻します。

********** ======================================================= 
********** Sample routine to Encrypt a passed in value (up to 16   
********** bytes in length) with a supplied key and return a       
********** 32 byte encrypted value in hex (suitable for storing in 
********** database, etc)                                         
********** ======================================================= 
SUBROUTINE NAME(ENCRYPT) PARMS((#KEY16 *RECEIVED) (#VAL16 *RECEIVED) (#HEX32 *RETURNED))
DEFINE     FIELD(#KEY16) TYPE(*CHAR) LENGTH(16) DESC('Encryption key supplied')
DEFINE     FIELD(#VAL16) TYPE(*CHAR) LENGTH(16) DESC('Value to be encrypted')
DEFINE     FIELD(#HEX32) TYPE(*CHAR) LENGTH(32) DESC('Encrypted value in Hex')
DEFINE     FIELD(#LEN) TYPE(*DEC) LENGTH(5) DECIMALS(0)           
CHANGE     #LEN 16                                                
********** Use ENCRYPT BIF to encrypt #VAL16 of length #LEN using 
********** #KEY16 to return encrypted value in #HEX32             
********** The encrypted value is converted into HEX resulting in 
********** a 32 byte value.
USE        BUILTIN(ENCRYPT) WITH_ARGS(#VAL16 #LEN #KEY16 YES) TO_GET(#HEX32)
ENDROUTINE                                                        
********** =======================================================
 

指定のキーを用いて16進数値を復号化(DECRYPT)して、暗号化されていない値に戻します。

********** ======================================================= 
********** Sample routine to Decrypt a passed in Hex value         
********** using the supplied key and return the unencrypted       
********** value.                                                  
********** ======================================================= 
SUBROUTINE DECRYPT ((#DKEY16 *Received)(#DHEX32 *Received) (#DVAL16 *Returned))
********** Key to be used for the decryption.This must be the     
********** same key that was used for the encryption.              
DEFINE     #DKEY16 *char 16                                        
DEFINE     FIELD(#DHEX32) TYPE(*CHAR) LENGTH(32) DESC('Encrypted value in hex')
DEFINE     FIELD(#DVAL16) TYPE(*CHAR) LENGTH(16) DESC('Decrypted value returned') 
DEFINE     FIELD(#DLEN) TYPE(*DEC) LENGTH(5) DECIMALS(0)            
CHANGE     FIELD(#DLEN) TO(16)                                      
**********
**********
********** Use DECRYPT BIF to decrypt character #HEX32 of length   
********** #DLEN using #DKEY16 to return decrypted value,#DVAL16    
**********                                                          
USE        BUILTIN(DECRYPT) WITH_ARGS(#HEX32 #DLEN #DKEY16 YES) TO_GET(#DVAL16)
ENDROUTINE                                                          
 

パスワードを暗号化(ENCRYPT)して、次に復号化(DECRYPT)します。

DEFINE     FIELD(#PASSWORD) TYPE(*CHAR) LENGTH(10)                 
DEFINE     FIELD(#TEXT) TYPE(*CHAR) LENGTH(16)                     
DEFINE     FIELD(#LENGTH) TYPE(*DEC) LENGTH(11) DECIMALS(0)        
DEFINE     FIELD(#KEY) TYPE(*CHAR) LENGTH(16)                      
DEFINE     FIELD(#RETCODE) TYPE(*CHAR) LENGTH(2)                   
DEFINE     FIELD(#ENCRYPTED) TYPE(*CHAR) LENGTH(16)                
DEFINE     FIELD(#DECRYPTED) TYPE(*CHAR) LENGTH(16)                
**********
********** Encrypt password with key                               
CHANGE     #TEXT #PASSWORD                                         
CHANGE     #LENGTH 16                                              
CHANGE     #KEY 'AXG12345lj0gtUMX'                                 
USE        BUILTIN(ENCRYPT) WITH_ARGS(#TEXT #LENGTH #KEY) TO_GET(#ENCRYPTED #RETCODE)
**********
********** Decrypt password with same key as provided for encryption
CHANGE     #LENGTH 16                                              
USE        BUILTIN(DECRYPT) WITH_ARGS(#ENCRYPTED #LENGTH #KEY) TO_GET(#DECRYPTED #RETCODE)
**********