1

COBOLでSHA1ハッシュを適用する方法があるかどうか疑問に思っていました。

SHA1 アルゴリズムがどのように機能するかについて少なくともいくつかの情報があれば、それは役に立ちます。

ありがとう

4

5 に答える 5

1

どの Cobol プラットフォームかはわかりませんでした。z/OS を使用している場合、Cobol から簡単に呼び出せるさまざまな暗号化サービスがあります。そして、これらのサービスの中で SHA1 が利用可能です。

于 2013-03-19T11:53:46.923 に答える
1

Python を COBOL に埋め込む小さなサンプルを作成し、例として MD5 チェックサムを選びました。

必ずしも Python を使用するわけではありませんが、幸運にも OpenCOBOL を使用できる場合は、libcrypto のすべての機能を単純な CALL で利用できます。

完全を期すために、Python の角度について言及しましたが、目標が単に暗号化である場合、これはかなり重い荷物です。その場合、OpenSSL の方がはるかに適しています。このリストはおそらくあなたのニーズには適していませんが、CALL と C アプリケーション バイナリ インターフェイスの能力を示しています。これが単なるノイズである場合はご容赦ください。

SourceForge から:

非常に高レベルの Python の埋め込みは非常に簡単です。

   >>SOURCE FORMAT IS FIXED
  *> *******************************************************
  *> Author:    Brian Tiffin 
  *> Date:      20130126 
  *> Purpose:   Embed Python 
  *> Tectonics: cobc -x cobpy.cob -lpython2.6 
  *> *******************************************************
   identification division.
   program-id. cobpy.

   procedure division.
   call "Py_Initialize"
       on exception
           display "link cobpy with -lpython2.6" end-display
   end-call
   call "PyRun_SimpleString" using
       by reference 
           "from time import time,ctime" & x"0a" &
           "print('Today is', ctime(time()))" & x"0a" & x"00"
       on exception continue
   end-call
   call "Py_Finalize" end-call
   goback.
   end program cobpy.

与える

$ cobc -x cobpy.cob -lpython2.6   
$ ./cobpy 
('Today is', 'Sat Jan 26 20:01:41 2013')

Python はタプルを忠実に表示しました。

しかし、高レベルのスクリプトの副作用のためだけに Python を使用するのは何の楽しみでしょうか? たくさん、それでも。

純粋な埋め込み。

   >>SOURCE FORMAT IS FIXED
  *> *******************************************************
  *> Author:    Brian Tiffin 
  *> Date:      20130126 
  *> Purpose:   Embed Python 
  *> Tectonics: cobc -x cobkat.cob -lpython2.6
  *>     NOTES:    leaks, no Py_DECREF macros called. 
  *> *******************************************************
   identification division.
   program-id. cobkat.

   data division.
   working-storage section.
   77 python-name          usage pointer.
   77 python-module        usage pointer.
   77 python-dict          usage pointer.
   77 python-func          usage pointer.
   77 python-stringer      usage pointer.
   77 python-args          usage pointer.
   77 python-value         usage pointer.

   01 cobol-buffer-pointer usage pointer.    
   01 cobol-buffer         pic x(80)               based.
   01 cobol-string         pic x(80).

   01 cobol-integer        usage binary-long.

   01 command-line-args    pic x(80).

  *> *******************************************************
   procedure division.
   call "Py_Initialize"
       on exception
           display "link cobpy with -lpython" end-display
   end-call

  *> Python likes module names in Unicode
   call "PyUnicodeUCS4_FromString" using
       by reference "pythonfile" & x"00"
       returning python-name
       on exception
           display "unicode problem" end-display
   end-call

  *> import the module, using PYTHONPATH 
   call "PyImport_Import" using
       by value python-name
       returning python-module
       on exception
           display "this would be borked" end-display
   end-call

   if python-module equal null
       display "no pythonfile.py in PYTHONPATH" end-display
   end-if

  *> within the module, an attribute is "pythonfunction"
   call "PyObject_GetAttrString" using
       by value python-module
       by reference "pythonfunction" & x"00"
       returning python-func
       on exception continue
   end-call

  *>
  *> error handling now skimped out on
  *>

  *> pythonfunction takes a single argument
   call "PyTuple_New" using
       by value 1
       returning python-args
   end-call

  *> of type long, hard coded to the ultimate answer 
   call "PyLong_FromLong" using
       by value 42
       returning python-value
   end-call

  *> set first (only) element of the argument tuple 
   call "PyTuple_SetItem" using
       by value python-args
       by value 0
       by value python-value
   end-call

  *> call the function, arguments marshalled for Python 
   call "PyObject_CallObject" using
       by value python-func
       by value python-args
       returning python-value
   end-call

  *> we know we get a long back, hopefully 1764
   call "PyLong_AsLong" using
       by value python-value
       returning cobol-integer 
   end-call
   display "Python returned: " cobol-integer end-display

  *> **************************************************** *<
  *> a function taking string and returning string
   call "PyObject_GetAttrString" using
       by value python-module
       by reference "pythonstringer" & x"00"
       returning python-stringer
   end-call

   call "PyTuple_New" using
       by value 1
       returning python-args
   end-call

  *> Use the OpenCOBOL command argument
   accept command-line-args from command-line end-accept 
   call "PyString_FromString" using
       by reference
           function concatenate(
               function trim(command-line-args)
               x"00")
       returning python-value
   end-call

  *> Set the function argument tuple to the cli args 
   call "PyTuple_SetItem" using
       by value python-args
       by value 0
       by value python-value
   end-call

  *> call the "pythonstringer" function
   call "PyObject_CallObject" using
       by value python-stringer
       by value python-args
       returning python-value
   end-call

  *> return as String (with the MD5 hex digest tacked on)
   call "PyString_AsString" using
       by value python-value
       returning cobol-buffer-pointer 
   end-call

  *> one way of removing null while pulling data out of C
   set address of cobol-buffer to cobol-buffer-pointer
   string
       cobol-buffer delimited by x"00" 
       into cobol-string
   end-string
   display "Python returned: " cobol-string end-display

  *> and clear out <*
   call "Py_Finalize" end-call
   goback.
   end program cobkat.

pythonfile.py

#
# Simple Python sample for OpenCOBOL embedding trial
#
def pythonfunction(i):
    return i * i 

import hashlib 
def pythonstringer(s):
    sum = hashlib.md5()
    sum.update(s)
    return s + ": " + sum.hexdigest() 

与える

$ ./cobkat Python will use this for MD5 hash
no pythonfile.py in PYTHONPATH
Attempt to reference unallocated memory (Signal SIGSEGV)
Abnormal termination - File contents may be incorrect

おっとっと

$ export PYTHONPATH=.
$ ./cobkat Python will use this for MD5 hash
Python returned: +0000001764
Python returned: Python will use this for MD5 hash: c5577e3ab8dea11adede20a1949b5fb3

これらのいずれかをしばらく行っていない、楽しい。

乾杯、ブライアン

ああ、あなたが読んでいる場合、1764 が最終的な答えの 2 乗です。

于 2013-03-19T16:39:17.743 に答える
1

ここでは、ポイント ソース リストについて詳しく説明します。OC_CBL_DUMP には OpenCOBOL 1.1CE が必要

まず、OpenSSL の作成者に敬意を表します。彼らはクレジットに値します。

  OpenSSL License
  ---------------

/* ====================================================================
 * Copyright (c) 1998-2011 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

 Original SSLeay License
 -----------------------

/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 *
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 *
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 *
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

暗号化と SHA1 ハッシュの 2 つの形式を実行するための COBOL

        >>source format is free
*> ***************************************************************
*> Author:    Brian Tiffin
*> Date:      20130321
*> Purpose:   Compute an SHA1 digest, whole
*> Tectonics: cobc -x sha1a.cob -lcrypto
*> ***************************************************************
IDENTIFICATION DIVISION.
program-id. sha1a.

data division.
working-storage section.
01 sha1-digest    pic x(20).
01 digestable     pic x(80) value "this message needs to be verified".

*> ***************************************************************
procedure division.

*> Compute disgest from block of memory
call "SHA1" using
   by reference digestable
   by value function length(function trim(digestable))
   by reference sha1-digest
   on exception
       display "link sha1.cob with OpenSSL's libcrypto" end-display
end-call

*> Dump the hash, as it'll unlikely be printable
call "CBL_OC_DUMP" using
    by reference sha1-digest
    on exception continue
end-call

goback.
end program sha1a.

のサンプル実行で

$ cobc -x sha1a.cob
$ ./sha1a
link sha1.cob with OpenSSL's libcrypto

Offset  HEX-- -- -- -5 -- -- -- -- 10 -- -- -- -- 15 --   CHARS----1----5-
000000  20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                   
000016  20 20 20 20                                                       

$ cobc -x sha1a.cob -lcrypto
$ ./sha1a

Offset  HEX-- -- -- -5 -- -- -- -- 10 -- -- -- -- 15 --   CHARS----1----5-
000000  c7 3b 52 0c 61 39 9b f9 a5 2f fe 3f 11 90 5e 10   .;R.a9.../.?..^.
000016  3b 0d 15 c5                                       ;...            

そして、複数の更新からダイジェストを構築する、より完全な例です。

ここでの前提: これは、末尾にスペースがあるファイルでクラックします。

       >>source format is free
*> ***************************************************************
*> Author:    Brian Tiffin
*> Date:      20130321
*> Purpose:   Compute an SHA1 digest, by piece
*> Tectonics: cobc -x sha1.cob -lcrypto
*> ***************************************************************
IDENTIFICATION DIVISION.
program-id. sha1.

environment division.
configuration section.

input-output section.
file-control.
    select samplefile
    assign to "sha1.cob"
    organization is line sequential
    file status is sample-status
    .

DATA DIVISION.
file section.
fd samplefile.
    01 input-line     pic x(2048).

working-storage section.
01 sha1-context      usage pointer.
01 sha1-libresult    usage binary-long.
   88 sha1-success      value 1 when set to false is 0.

01 sha1-digest       pic x(20).

01 sample-status     pic 9999.
01 sample-file-state pic 9.
   88 no-more-sample    value 9 when set to false is 0.

01 sha-ctx-structure pic x(1024).

*> ***************************************************************
PROCEDURE DIVISION.

*> Compute disgest from a sequential file
open input samplefile
if sample-status not equal to zero
    display "Status of " sample-status " returned from open" end-display
    display "rest of sample run will be garbage" end-display
end-if

*> Init the SHA1 internals
set sha1-context to address of sha-ctx-structure
call "SHA1_Init" using
    by value sha1-context
    returning sha1-libresult
    on exception
        display "Can't find SHA1_Init.  hint: cobc -x sha1 -lcrypto" end-display
end-call
if not sha1-success
    display "Could not initialize SHA1 structures" end-display
    display "normally you'd want to stop run and call the emergency hotline to wake up the support techs, but this is an example and blindly continues." end-display
end-if

*> loop across some data, ignoring issue of trailing spaces on input lines
read samplefile at end set no-more-sample to true end-read
if input-line equal spaces then
    move x"0a" to input-line(1:1)
else
    move function concatenate(function trim(input-line trailing), x"0a") to input-line
end-if

perform until no-more-sample
    call "SHA1_Update" using
        by value sha1-context
        by content function trim(input-line trailing)
        by value function length(function trim(input-line trailing))
        on exception display "internal update failure of SHA1_Update" end-display
    end-call
    if not sha1-success
        display "Could not update SHA1 structures" end-display
        display "normally you'd want to stop run." end-display
    end-if

    read samplefile at end set no-more-sample to true end-read
    if input-line equal spaces then
        move x"0a" to input-line(1:1)
    else
        move function concatenate(function trim(input-line trailing), x"0a") to input-line
    end-if
end-perform

*> finalize the disgest
call "SHA1_Final" using
    by reference sha1-digest
    by value sha1-context
    on exception display "you're kidding right? internal failure of SHA1_Final" end-display
end-call

close samplefile

*> Dump the hash, as it'll unlikely be printable
call "CBL_OC_DUMP" using
    by reference sha1-digest
    on exception continue
end-call

goback.
END PROGRAM sha1.

および別のサンプル実行

$ cobc -x sha1.cob -lcrypto
$ ./sha1

Offset  HEX-- -- -- -5 -- -- -- -- 10 -- -- -- -- 15 --   CHARS----1----5-
000000  d4 04 4b ed 02 e8 ef 54 e0 c4 73 0b 6b 51 85 bc   ..K....T..s.kQ..
000016  85 73 d3 16                                       .s..            

$ openssl sha1 sha1.cob
SHA1(sha1.cob)= d4044bed02e8ef54e0c4730b6b5185bc8573d316
于 2013-03-21T18:31:16.700 に答える
0

SHA1 は、COBOL では一般にサポートされていない多くのビット単位の演算 (XOR、AND、OR) を必要とします (少数のコンパイラでサポートされています)。

あなたの最善の策は、多くの C 実装の 1 つを単純に調整して、COBOL サブルーチンとして簡単に呼び出せるようにすることです。

プラットフォームとコンパイラに関する情報が役立ちます。

于 2013-03-19T02:10:09.047 に答える
0

はい、COBOL で SHA1 ハッシュを適用する方法があります。私は COBOL で SHA256 ハッシュ アルゴリズムを作成しました。途中のすべてのポイントで何が起こっているかを正確に把握できるように、いたるところに大量のテレメトリがあります。COBOL で SHA256 を実行できる場合は、COBOL で SHA-1 を実行できます。

小さな入力文字列をハッシュしてスクイブしないでください。ドキュメント認証に使用できるように、一連の入力文字に対してプログラムが機能することを確認してください。仕様全体を理解していれば、その結果も正しいものになります。そして、ビットコインのように、ハッシュをハッシュできるかどうかを確認します。これは、額面どおりに見えるよりも少しトリッキーです。

他の誰かが書いたサブプログラムを呼び出すだけでなく、実際の作業を行うために、COBOL自体でコーディングを行う必要があると想定しています。それは誰にでもできることだから、ただそれだけなのかと問われることはないだろう。

Github を見て、SHA256 アルゴリズムがどのように機能するかを確認してください。また、最終結果だけでなく、アニメーション化された中間計算の例も示しています。

IMO が完全な仕様を見つけることは、最も難しいことです。ユーチューブの動画はたくさんありますが、それらはストーリー全体のごく一部を説明しているだけです。しかし、COBOL スキル、特にテーブル処理だけでなく、コードの構造化にも弱点がある場合、SPECS を最終的に理解したとしても、希望する方法に応じて、SPECS を機能するコードに変換するのに多くの問題が発生します。あなたのコードを書いてください。変換中心の設計が役立ちます。

このリンクも役立ちます。 https://hackernoon.com/how-sha-2-works-a-step-by-step-tutorial-sha-256-46103t6k それと Github のものを一緒に使用しますが、両方が同じ入力例を使用するわけではありませんストリング。

要約すると、これは分析スキル、デザイン スキル、コーディング スキル、テスト スキルに関するものです。

幸運を。行き方をみんなに知らせましょう。

2021 年 7 月 18 日に追記 https://github.com/DoHITB/CryptoCobol/blob/main/SHA1HEX.CBL

于 2021-07-17T07:34:27.737 に答える