2013-10-21 49 views
1

上下文:我正在對Lotusscript實施SHA-256哈希處理。在LotusScript中無符號長整數?如何長時間關閉溢出檢測?

散列工作在32位。 LotusScript只有簽名長。當結果大於2,147,483,647時,我們得到溢出

問題:如何關閉溢出檢測 on Long?

如果不可能,是否有解決方法?我在想什麼Richard Schwartzhttp://femkegoedhart.com/2012/02/05/lotusscript-timedifference-long-data-type-grrr/有wr,我怎麼能使用NotesDateTime來解決我的問題?

我應該「忘記」,但隨後如何在LotusScript中散列(好吧,我能想到用LS2J並使用標準的java SHA 256)

當然,如果你已經有了SHA-的LS實施256這也是:-)

感謝您的幫助了良好的反響,我覺得有點失落......代碼

部分:

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) 

NB我根據我的實現Ø n工作Chris Venesshttp://www.movable-type.co.uk/scripts/sha256.html

+1

我還沒有研究SHA-256,所以我發佈這個評論,而不是作爲答案;如果SHA-256特意針對32位無符號操作進行優化,則可以忽略此評論。恕我直言,LotusScript(或類似語言)中的任何加密函數都應該使用字節數據類型的數組來實現。另外,請記住,LotusScript中的本地字符串是Unicode(UTF-16),所以您必須非常小心 - 特別是如果您希望將接受字符串輸入的代碼驗證爲UTF-8,那麼您的散列應該被驗證。 –

+1

嘗試將算法分成更小的步驟並將部分結果轉換爲適合變量極限。 –

回答

2

您無法關閉LotusScript中LONG的溢出檢測。此外,您在BIN()函數之上的示例將嘗試將其轉換爲長整型,這樣就排除了DOUBLE的使用。

dateTime對象,它將數字視爲長符號無符號,它可能是一個黑客使用。

就我個人而言,我建議創建一個小型的C DLL來完成工作並將其作爲字符串傳回。

或者用Java創建代碼,因爲它沒有與LS具有相同的限制。

+0

你是什麼意思「這樣就排除了使用DOUBLE」?使用dateTime的 –

+0

肯定會成爲黑客...我承認它!我不會樂意使用這種技巧,並在轉換之前停止恐懼... –

+0

double將爲您保留您想要的值,但是當您嘗試使用BIN(值)時,如果值不是INTEGER或LONG,它會嘗試將其轉換爲LONG。它會在那個時候失敗。 –

0

正如回答Simon O'Doherty所述,無法關閉LotusScript中LONG的溢出檢測。

我放棄LS方式......現在(也許我會做一個其它的嘗試一天。弗朗齊歇克科蘇特,你的權利,我需要從一開始的變量限制採取......這裏的棘手的部分)

感謝您的幫助!

* Simon:我優先考慮做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) 
0

您可以使用LS的COM組件並調用它。有許多經過充分開發和驗證的SHA-256(以及其他哈希)COM組件。

如果你遵循這條路線,你將需要將返回值'處理'爲一個字符串或其他二進制編碼(base64?),因爲結果可能(或可能不)需要無符號長整數來保存一個原始值。大多數這些組件提供了這樣做的方法。

對於今天的應用程序位'老式',但嘿,你正在使用LS,所以也許這不是一個問題。