1

我想知道是否有任何方法可以将 SHA1 哈希与 COBOL 一起应用。

如果至少有一些关于 SHA1 算法如何工作的信息,它将很有用。

谢谢

4

5 回答 5

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.]
 */

和一些 COBOL 来练习密码学和 SHA1 哈希的两种形式

        >>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 回答
1

你没有说哪个 Cobol 平台。如果您在 z/OS 上,可以从 Cobol 轻松调用各种加密服务。SHA1 在这些服务中可用。

于 2013-03-19T11:53:46.923 回答
1

我做了一个在 COBOL 中嵌入 Python 的小样本,并选择了一个 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 是最终答案,平方。

于 2013-03-19T16:39:17.743 回答
0

SHA1 需要很多 COBOL 通常不支持的按位运算(XOR、AND、OR)(少数编译器支持它们)。

您最好的选择是简单地调整众多 C 实现之一,以便可以轻松地将其称为 COBOL 子例程。

有关您的平台和编译器的信息会很有用。

于 2013-03-19T02:10:09.047 回答
0

是的,有一种方法可以使用 COBOL 应用 SHA1 哈希。我用 COBOL 编写了 SHA256 散列算法,到处都有大量的遥测数据,让你确切地知道一路上所有点发生了什么。如果你可以在 COBOL 中做 SHA256,你可以在 COBOL 中做 SHA-1。

不要通过散列小的输入字符串来爆破它。确保您的程序适用于大量输入字符,以便它可以用于文档身份验证。如果您了解了整个规格,那么您的结果也将是正确的。然后,看看你是否可以散列哈希——就像比特币一样。这比表面上看起来要棘手一些。

我假设您必须在 COBOL 本身中进行编码,以便您完成真正的工作 - 而不仅仅是调用其他人编写的子程序。任何人都可以做到这一点,所以你不会问是否只是那样。

在 Github 上查看 SHA256 算法的工作原理。它还显示了示例动画中间计算,而不仅仅是最终结果。

IMO 找到完整的规范是迄今为止最难的事情。有许多 youtube 视频,但它们只描述了整个故事的一小部分。但是,如果你的 COBOL 技能有任何弱点,尤其是表格处理,而且在构建代码方面也有任何弱点,即使你最终理解了规范,你也会在将规范转换为工作代码时遇到很多麻烦,这取决于你想要如何写下你的代码。以转换为中心的设计有帮助。

这个链接也是一个很好的帮助。 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 回答