1

上下文:我正在对 Lotusscript 实施 SHA-256 散列。

散列适用于 32 位。LotusScript 仅签署了Long。当结果大于 2,147,483,647 我们得到溢出

问题:如何关闭Long 上的溢出检测?

如果不可能,是否有解决方法?我在思考Richard Schwartzhttp://femkegoedhart.com/2012/02/05/lotusscript-timedifference-long-data-type-grrr/中所写的内容,我该如何使用 NotesDateTime 来帮助解决我的问题?

我应该“忘记这个”,然后如何在 Lotusscript 中进行散列(好吧,我可以考虑使用 LS2J 并使用标准的 java SHA 256)

当然,如果您有 SHA-256 的 LS 实现,这也是一个很好的回应 :-)

感谢您的帮助,我感到有些失落...

部分代码:

Dim T1 As Long
Dim h2 As Long 
Dim Sigma1 As Long
Dim K_t As Long

h2=1541459225
Sigma1 = 21895337
K_t=1116352408 

MsgBox String(32-Len(Bin$(h2)),"0")+Bin$(h2)+" " +"Bin$(h2)"+Chr$(13)+ _
String(32-Len(Bin$(Sigma1)),"0")+Bin$(Sigma1)+" " +"Bin$(Sigma1)"+Chr$(13)+ _
String(32-Len(Bin$(K_t)),"0")+Bin$(K_t)+" " +"Bin$(K_t)",,"DEBUG" 

T1 = h2 + Sigma1
MsgBox "T1 = " & T1 & " binary representation:" + String(32-Len(Bin$(T1)),"0")+  Bin$(T1)

T1 = h2 + Sigma1 + K_t  ' **this line cause overflow**
MsgBox "T1 = " & T1 & " binary representation:" + String(32-Len(Bin$(T1)),"0")+  Bin$(T1)

注意我的实现基于Chris Veness的工作:http ://www.movable-type.co.uk/scripts/sha256.html

4

3 回答 3

2

您不能在 LotusScript 中关闭 LONG 的溢出检测。此外,您在 BIN() 函数上方的示例将尝试转换为 long,因此排除了使用 DOUBLE。

dateTime 对象虽然将数字视为 LONG 无符号,但使用起来可能有点小技巧。

就我个人而言,我建议创建一个小型 C DLL 来完成这项工作并将其作为字符串传回。

或者在 Java 中创建您的代码,因为它没有 LS 所具有的相同限制。

于 2013-10-21T08:02:38.020 回答
0

正如 Simon O'Doherty 所回答的那样,无法关闭 LotusScript 中 LONG 的溢出检测。

我放弃了 LS 方式......现在(也许有一天我会再尝试一次。Frantisek Kossuth,你的权利,我需要从一开始就接受可变限制......这里的棘手部分)

谢谢你的帮助!

*Simon:比起DLL,我更喜欢做LS2J!

我加入了java中非常简单的类:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHA256 {
public String sha256(String message) throws NoSuchAlgorithmException {
    MessageDigest md1 = MessageDigest.getInstance("SHA-256");
    String resu = A9Utility.bytesToHex(md1.digest(message.getBytes()));

    System.out.println("here SHA256: resu ="+resu);
    return resu;
}
}

对于 A9Utility.bytesToHex,我使用了https://code.google.com/p/a9cipher/source/browse/src/cosc385final/A9Utility.java

所以我现在在 LS 的电话是:

UseLSX "*javacon"   
Use "SHA256"
[...]
Dim mySession As JavaSession
Dim myClass As JavaClass
Dim myObject As JavaObject
Set mySession = New JavaSession()

Set myClass = mySession.GetClass("SHA256")
Set myObject = myClass.CreateObject()

Dim resu As String
resu = myObject.sha256(message)
于 2013-10-23T15:09:31.487 回答
0

您可以在 LS 中使用 COM 组件并调用它。那里有许多开发良好且经过验证的 SHA-256(和其他哈希)COM 组件。

如果您遵循这条路线,您将需要将返回值“处理”为字符串或其他一些二进制编码(base64?),因为结果可能(或可能不需要)需要无符号长整数来保存原始值。这些组件中的大多数都提供了执行此操作的方法。

对于今天的应用程序来说有点“老式”,但是,嘿,你正在使用 LS,所以也许这不是问题。

于 2016-12-04T18:25:00.447 回答