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です。 |
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)
**********