上下文:我正在对Lotusscript实施SHA-256哈希。
Hashing适用于32位。 LotusScript只有签名 Long。当结果大于2,147,483,647时,我们得到溢出。
问题:如何关闭Long上的溢出检测?
如果不可能,是否有解决方法?我在考虑 Richard Schwartz 在http://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
答案 0 :(得分:2)
您无法在LotusScript中关闭LONG上的溢出检测。此外,您在BIN()函数上方的示例将尝试转换为long,以排除使用DOUBLE。
dateTime,对象虽然它将数字视为LONG unsigned,但它可能有点使用。
就个人而言,我建议创建一个小C DLL来完成工作并将其作为字符串传回。
或者用Java创建代码,因为它没有LS所具有的相同限制。
答案 1 :(得分:0)
正如Simon O'Doherty所说,无法在LotusScript中关闭LONG上的溢出检测。
我放弃了LS的方式......现在(也许我有一天会做另一次尝试.Frantisek Kossuth,你的权利我需要从开始变量限制......这里的棘手部分)
感谢您的帮助!
*西蒙:我更喜欢做LS2J而不是DLL!
我加入了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)
答案 2 :(得分:0)
您可以在LS中使用COM组件并调用它。有许多经过充分开发和验证的SHA-256(和其他哈希)COM组件。
如果您遵循此路由,则需要将返回值“处理”为字符串或其他二进制编码(base64?),因为结果可能(或可能不)需要unsigned long来保存原始值。大多数这些组件提供了执行此操作的方法。
对于今天的应用程序有点“老式”,但是,嘿,你正在使用LS,所以也许这不是一个问题。