Avatar billede horus Nybegynder
09. februar 2001 - 13:44 Der er 17 kommentarer og
1 løsning

Tekst kryptering/dekryptering

Hejsa,

Jeg leder efter et værktøj hvorved jeg kan kryptere og dekryptere tekstlinie via VB.

Krypteringsalgoritmen skal være SIKKER - dvs. meget gerne leve op til den nyindførte standard (kan ikke lige huske hvad den hedder).

Det er som sagt ikke filkryptering jeg er ude efter, men tekst kryptering. Krypteringen/dekrypteringen skal kunne benytte en \"nøgle\" til (de)krypteringer, og nøglen skal jeg selv kunne bestemme...

Er der nogle der kender til et sådan værktøj ??? Det gør ikke noget at det koster lidt i anskaffelse - jeg er altså ikke kun ude efter freeware løsninger (men findes der nogle sådanne som er lige så sikre som andre, så er det da at foretrække :-)

Håber der er nogle der kan hjælpe - sig til hvis der er nogle spørgsmål.....

Pointene fordeles evt. mellem flere gode svar....

Horus


Avatar billede cstern Nybegynder
09. februar 2001 - 14:08 #1
sPGP. Jeg skal lige finde et link. Kræver PGP installeret (freeware)
Avatar billede cstern Nybegynder
09. februar 2001 - 14:09 #2
http://www.oz.net/~srheller/spgp/

Det er en DLL med interface der kan bruges i VB.
Avatar billede horus Nybegynder
09. februar 2001 - 14:10 #3
Det må ikke kræve eksterne installationer... det skal kunne installeres sammen med VB programmet uden at brugerne mærker noget.....

Horus
Avatar billede cstern Nybegynder
09. februar 2001 - 14:15 #4
OK. Der findes mange krypterings rutiner, men de fleste er enten elendige eller koster (mange) penge og er elendige ;-)
Jeg har søgt en del efter krypteringsrutiner men hvis det skal være sikkert nok er man nødt til at bruge noget a la PGP.
De fleste krypteringer baserer sig på XOR kryptering som er meget simpel og let at bryde hvis man virkelig vil. Husk også på, at de fleste krypteringer benytter 8-bit tegnsæt, så den kodede streng vil have tegn, der ikke kan printes. Her er PGP bedre da du kan definere Ascii-armour som er \"klar-tekst\" dvs almindelige tegn.

Men der var vist en anden rutine som så nogenlunde ud, nu jeg tænker efter. Jeg chekker lige mit kodebibliotek...

Hvad skal du bruge det til, nærmere bestemt?
Avatar billede cstern Nybegynder
09. februar 2001 - 14:18 #5
Blowfish er rimeligt godt, faktisk:
http://www.counterpane.com/blowfish.html
og twofish udviklet af Jens Søderberg:
http://www.counterpane.com/twofish.html

Det var twofish jeg tænkte på. Fungerer fint, men genererer kode i stykker af 16 tegn, så vidt jeg husker (og derfor kunne jeg ikke bruge det, men godt ellers!)
Avatar billede horus Nybegynder
09. februar 2001 - 14:24 #6
Jeg kigger linkene efter i sømmene...

Jeg vil bruge det til at kryptere nogle brugeres passwords - det er brugere der er RET interessante så der vil sikkert være hyppige forsøg på at bryde disse passwords, derfor skal det være så sikkert som muligt....

Hvad er det den nye \"krypteringsstandard\" der er udviklet af en eller anden Belgier og som blev valgst som standard til afløsning af en gammel standard her i slutningen af sidste år, hedder ????

For det måtte meget gerne være noget der er SÅ sikkert......

Horus
Avatar billede cstern Nybegynder
09. februar 2001 - 14:24 #7
PS. jeg har en testapp til twofish som jeg har fået af Jens. Hvis du vil have denne kan du bare skrive. PS. du skal under alle omstændigheder hente dll mv i grundpakken (sidste link ovenfor - \"visual Basic version)\"
Avatar billede cstern Nybegynder
09. februar 2001 - 14:25 #8
PS. jeg har en testapp til twofish som jeg har fået af Jens. Hvis du vil have denne kan du bare skrive. PS. du skal under alle omstændigheder hente dll mv i grundpakken (sidste link ovenfor - \"visual Basic version)\"
Avatar billede horus Nybegynder
09. februar 2001 - 14:26 #9
Jeg kigger linkene efter i sømmene...

Jeg vil bruge det til at kryptere nogle brugeres passwords - det er brugere der er RET interessante så der vil sikkert være hyppige forsøg på at bryde disse passwords, derfor skal det være så sikkert som muligt....

Hvad er det den nye \"krypteringsstandard\" der er udviklet af en eller anden Belgier og som blev valgst som standard til afløsning af en gammel standard her i slutningen af sidste år, hedder ????

For det måtte meget gerne være noget der er SÅ sikkert......

Horus
Avatar billede cstern Nybegynder
09. februar 2001 - 14:27 #10
PS. jeg har en testapp til twofish som jeg har fået af Jens. Hvis du vil have denne kan du bare skrive. PS. du skal under alle omstændigheder hente dll mv i grundpakken (sidste link ovenfor - \"visual Basic version)\"
Avatar billede cstern Nybegynder
09. februar 2001 - 14:27 #11
PS. jeg har en testapp til twofish som jeg har fået af Jens. Hvis du vil have denne kan du bare skrive. PS. du skal under alle omstændigheder hente dll mv i grundpakken (sidste link ovenfor - \"visual Basic version)\"
Avatar billede horus Nybegynder
09. februar 2001 - 15:23 #12
Rijndal hedder ham der har lavet den algoritme der er blevet valgt som AES standard til afløsning af den gamle DES standard. Twofish var vist med i opløbet, så den kan vel ikke være helt skidt ? :-)

Du kender ikke til nogen der benytter Rijndal\'s algoritme ? Jeg mener, så kan det vel ikke blive meget bedre.....

Jeg vil meget gerne se din testapp, kan du ikke sende den til musty@post.com ?

Takker,

Horus
Avatar billede cstern Nybegynder
09. februar 2001 - 15:34 #13
Ja, du kan se hele testrapporten på http://www.counterpane.com/twofish.html

Jeg sender dig filerne.
Avatar billede cstern Nybegynder
09. februar 2001 - 15:34 #14
(AES Finalist Performance Comparison)
Avatar billede cstern Nybegynder
09. februar 2001 - 15:41 #15
Avatar billede xafion Nybegynder
09. februar 2001 - 20:20 #16
<<< Bongo Jungo >>>
TEA Cryptography

Udviklet år 2000 af Fredrik Qvarfort.

Kopier det hele over i en CLASS fil. (eller module)
Select Case DitValg

Case CLASS
    Indsæt \"Public etellerandet as New CLASSNAVN\"

Example:
Public Crypt as new TEAEncryption

\'Erstat msgbox med f.eks.  text1.text =
Msgbox Crypt.EncryptString(\"DA TEKST\",\"DA KEY\")

\'
Msgbox Crypt.DecryptString.... etc...


Case Module
    Put det i en module og bare skriv 
    ? = EncryptString
osv.


End Select


Xafion


<<<CUt\'n\'Paste!>>>



\'TEA Encryption/Decryption Class

Private Declare Sub CopyMem Lib \"kernel32\" Alias \"RtlMoveMemory\" (Destination As Any, Source As Any, ByVal Length As Long)

Private m_RunningCompiled As Boolean

Private Tk(3) As Long
Private Const ROUNDS = 32
Private Const Delta = &H9E3779B9
Private Const DecryptSum = &HC6EF3720  \'Delta * Rounds (precalculated to prevent overflow error)

Public Static Sub GetWord(LongValue As Long, CryptBuffer() As Byte, Offset As Long)
  Dim bb(0 To 3) As Byte
  bb(3) = CryptBuffer(Offset)
  bb(2) = CryptBuffer(Offset + 1)
  bb(1) = CryptBuffer(Offset + 2)
  bb(0) = CryptBuffer(Offset + 3)
  Call CopyMem(LongValue, bb(0), 4)

End Sub

Public Static Sub PutWord(LongValue As Long, CryptBuffer() As Byte, Offset As Long)
  Dim bb(0 To 3) As Byte
  Call CopyMem(bb(0), LongValue, 4)
  CryptBuffer(Offset) = bb(3)
  CryptBuffer(Offset + 1) = bb(2)
  CryptBuffer(Offset + 2) = bb(1)
  CryptBuffer(Offset + 3) = bb(0)

End Sub
Public Static Function UnsignedAdd(ByVal Data1 As Long, Data2 As Long) As Long
 
  Dim x1(0 To 3) As Byte
  Dim x2(0 To 3) As Byte
  Dim xx(0 To 3) As Byte
  Dim Rest As Long
  Dim Value As Long
  Dim a As Long
 
  Call CopyMem(x1(0), Data1, 4)
  Call CopyMem(x2(0), Data2, 4)
 
  Rest = 0
  For a = 0 To 3
    Value = CLng(x1(a)) + CLng(x2(a)) + Rest
    xx(a) = Value And 255
    Rest = Value \\ 256
  Next
 
  Call CopyMem(UnsignedAdd, xx(0), 4)

End Function

Public Function UnsignedDel(Data1 As Long, Data2 As Long) As Long

  Dim x1(0 To 3) As Byte
  Dim x2(0 To 3) As Byte
  Dim xx(0 To 3) As Byte
  Dim Rest As Long
  Dim Value As Long
  Dim a As Long
 
  Call CopyMem(x1(0), Data1, 4)
  Call CopyMem(x2(0), Data2, 4)
  Call CopyMem(xx(0), UnsignedDel, 4)
 
  For a = 0 To 3
    Value = CLng(x1(a)) - CLng(x2(a)) - Rest
    If (Value < 0) Then
      Value = Value + 256
      Rest = 1
    Else
      Rest = 0
    End If
    xx(a) = Value
  Next
 
  Call CopyMem(UnsignedDel, xx(0), 4)

End Function

Public Function EncryptString(Text As String, Optional Key As String) As String

  Dim ByteArray() As Byte
  ByteArray() = StrConv(Text, vbFromUnicode)
  Call EncryptByte(ByteArray(), Key)
  EncryptString = StrConv(ByteArray(), vbUnicode)

End Function
Public Function DecryptString(Text As String, Optional Key As String) As String

  Dim ByteArray() As Byte
  ByteArray() = StrConv(Text, vbFromUnicode)
  Call DecryptByte(ByteArray(), Key)
  DecryptString = StrConv(ByteArray(), vbUnicode)

End Function
Public Sub EncryptByte(ByteArray() As Byte, Optional Key As String)

  Dim X As Long
  Dim sum As Long
  Dim Offset As Long
  Dim OrigLen As Long
  Dim LeftWord As Long
  Dim RightWord As Long
  Dim CipherLen As Long
  Dim CipherLeft As Long
  Dim CipherRight As Long
  Dim Sl As Long
  Dim Sr As Long
 
  If (Len(Key) > 0) Then Me.Key = Key
 
  \'Get the length of the original array
  OrigLen = UBound(ByteArray) + 1
 
  \'First we add 12 bytes (4 bytes for the
  \'length and 8 bytes for the seed values
  \'for the CBC routine), and the ciphertext
  \'must be a multiple of 8 bytes
  CipherLen = OrigLen + 12
  If (CipherLen Mod 8 <> 0) Then
    CipherLen = CipherLen + 8 - (CipherLen Mod 8)
  End If
  ReDim Preserve ByteArray(CipherLen - 1)
  Call CopyMem(ByteArray(12), ByteArray(0), OrigLen)
 
  \'Store the length descriptor in bytes [9-12]
  Call CopyMem(ByteArray(8), OrigLen, 4)
 
  \'Store a block of random data in bytes [1-8],
  \'these work as seed values for the CBC routine
  \'and is used to produce different ciphertext
  \'even when encrypting the same data with the
  \'same key)
  Call Randomize
  Call CopyMem(ByteArray(0), CLng(2147483647 * Rnd), 4)
  Call CopyMem(ByteArray(4), CLng(2147483647 * Rnd), 4)
 
  \'Encrypt the data in 64-bit blocks
  For Offset = 0 To (CipherLen - 1) Step 8
    \'Get the next 64-bit block as two longs
    Call GetWord(LeftWord, ByteArray(), Offset)
    Call GetWord(RightWord, ByteArray(), Offset + 4)
   
    \'XOR the plaintext with the previous
    \'ciphertext (CBC, Cipher-Block Chaining)
    LeftWord = LeftWord Xor CipherLeft
    RightWord = RightWord Xor CipherRight
   
    \'Encrypt the block
    sum = 0
    For X = 1 To ROUNDS
      If (m_RunningCompiled) Then
        sum = (sum + Delta)
        Sr = ((RightWord And &HFFFFFFE0) \\ 32) And &H7FFFFFF
        LeftWord = LeftWord + (((RightWord * 16) + Tk(0)) Xor (RightWord + sum) Xor (Sr + Tk(1)))
        Sl = ((LeftWord And &HFFFFFFE0) \\ 32) And &H7FFFFFF
        RightWord = RightWord + (((LeftWord * 16) + Tk(2)) Xor (LeftWord + sum) Xor (Sl + Tk(3)))
      Else
        sum = UnsignedAdd(sum, Delta)
        LeftWord = UnsignedAdd(LeftWord, (UnsignedAdd(LShift4(RightWord), Tk(0)) Xor UnsignedAdd(RightWord, sum) Xor UnsignedAdd(RShift5(RightWord), Tk(1))))
        RightWord = UnsignedAdd(RightWord, (UnsignedAdd(LShift4(LeftWord), Tk(2)) Xor UnsignedAdd(LeftWord, sum) Xor UnsignedAdd(RShift5(LeftWord), Tk(3))))
      End If
    Next
   
    \'Store the block
    Call PutWord(LeftWord, ByteArray(), Offset)
    Call PutWord(RightWord, ByteArray(), Offset + 4)
   
    \'Store the cipherblocks (for CBC)
    CipherLeft = LeftWord
    CipherRight = RightWord

  Next

End Sub
Private Static Function LShift4(Data1 As Long) As Long

  Dim x1(0 To 3) As Byte
  Dim xx(0 To 3) As Byte
 
  Call CopyMem(x1(0), Data1, 4)
  xx(0) = ((x1(0) And 15) * 16)
  xx(1) = ((x1(1) And 15) * 16) Or ((x1(0) And 240) \\ 16)
  xx(2) = ((x1(2) And 15) * 16) Or ((x1(1) And 240) \\ 16)
  xx(3) = ((x1(3) And 15) * 16) Or ((x1(2) And 240) \\ 16)
  Call CopyMem(LShift4, xx(0), 4)
 
End Function
Private Static Function RShift5(Data1 As Long) As Long

  Dim x1(0 To 3) As Byte
  Dim xx(0 To 3) As Byte
 
  Call CopyMem(x1(0), Data1, 4)
  xx(0) = ((x1(0) And 224) \\ 32) Or ((x1(1) And 31) * 8)
  xx(1) = ((x1(1) And 224) \\ 32) Or ((x1(2) And 31) * 8)
  xx(2) = ((x1(2) And 224) \\ 32) Or ((x1(3) And 31) * 8)
  xx(3) = ((x1(3) And 224) \\ 32)
  Call CopyMem(RShift5, xx(0), 4)
 
End Function


Public Sub DecryptByte(ByteArray() As Byte, Optional Key As String)

  Dim X As Long
  Dim sum As Long
  Dim Offset As Long
  Dim OrigLen As Long
  Dim LeftWord As Long
  Dim RightWord As Long
  Dim CipherLen As Long
  Dim CipherLeft As Long
  Dim CipherRight As Long
  Dim CurrPercent As Long
  Dim NextPercent As Long
 
  Dim Sr As Long
  Dim Sl As Long
 
  \'Set the new key if provided
  If (Len(Key) > 0) Then Me.Key = Key
 
  \'Get the length of the bytearray
  CipherLen = UBound(ByteArray) + 1
 
  \'Tk(0) = 16
  \'Tk(1) = 16
  \'Tk(2) = 16
  \'Tk(3) = 16
 
  For Offset = 0 To (CipherLen - 1) Step 8
    \'Get the next block of ciphertext
    Call GetWord(LeftWord, ByteArray(), Offset)
    Call GetWord(RightWord, ByteArray(), Offset + 4)
   
    sum = DecryptSum
    For X = 1 To ROUNDS
      If (m_RunningCompiled) Then
        Sl = ((LeftWord And &HFFFFFFE0) \\ 32) And &H7FFFFFF
        RightWord = RightWord - (((LeftWord * 16) + Tk(2)) Xor (LeftWord + sum) Xor (Sl + Tk(3)))
        Sr = ((RightWord And &HFFFFFFE0) \\ 32) And &H7FFFFFF
        LeftWord = LeftWord - (((RightWord * 16) + Tk(0)) Xor (RightWord + sum) Xor (Sr + Tk(1)))
        sum = (sum - Delta)
      Else
        RightWord = UnsignedDel(RightWord, (UnsignedAdd(LShift4(LeftWord), Tk(2)) Xor UnsignedAdd(LeftWord, sum) Xor UnsignedAdd(RShift5(LeftWord), Tk(3))))
        LeftWord = UnsignedDel(LeftWord, (UnsignedAdd(LShift4(RightWord), Tk(0)) Xor UnsignedAdd(RightWord, sum) Xor UnsignedAdd(RShift5(RightWord), Tk(1))))
        sum = UnsignedDel(sum, Delta)
      End If
    Next
   
    \'XOR with the previous cipherblock
    LeftWord = LeftWord Xor CipherLeft
    RightWord = RightWord Xor CipherRight
   
    \'Store the current ciphertext to use
    \'XOR with the next block plaintext
    Call GetWord(CipherLeft, ByteArray(), Offset)
    Call GetWord(CipherRight, ByteArray(), Offset + 4)
   
    \'Store the block
    Call PutWord(LeftWord, ByteArray(), Offset)
    Call PutWord(RightWord, ByteArray(), Offset + 4)
   
    \'Update the progress if neccessary

  Next

  \'Get the size of the original array
  Call CopyMem(OrigLen, ByteArray(8), 4)
 
  \'Make sure OrigLen is a reasonable value,
  \'if we used the wrong key the next couple
  \'of statements could be dangerous (GPF)
  If (CipherLen - OrigLen > 19) Or (CipherLen - OrigLen < 12) Then
    Call Err.Raise(vbObjectError, , \"Incorrect size descriptor in TEA decryption\")
  End If
 
  \'Resize the bytearray to hold only the plaintext
  \'and not the extra information added by the
  \'encryption routine
  Call CopyMem(ByteArray(0), ByteArray(12), OrigLen)
  ReDim Preserve ByteArray(OrigLen - 1)

 
End Sub
Public Property Let Key(New_Value As String)

  Dim K() As Byte
  Dim w(0 To 3) As Byte
 
  \'Convert the key to a bytearray and if
  \'needed resize it to be exactly 128-bit
  K() = StrConv(New_Value, vbFromUnicode)
  If (Len(New_Value) < 16) Then ReDim Preserve K(15)
 
  w(0) = K(3)
  w(1) = K(2)
  w(2) = K(1)
  w(3) = K(0)
  Call CopyMem(Tk(0), w(0), 4)

  w(0) = K(7)
  w(1) = K(6)
  w(2) = K(5)
  w(3) = K(4)
  Call CopyMem(Tk(1), w(0), 4)

  w(0) = K(11)
  w(1) = K(10)
  w(2) = K(9)
  w(3) = K(8)
  Call CopyMem(Tk(2), w(0), 4)

  w(0) = K(15)
  w(1) = K(14)
  w(2) = K(13)
  w(3) = K(12)
  Call CopyMem(Tk(3), w(0), 4)

End Property
Private Sub Class_Initialize()
 
  \'We need to check if we are running in compiled
  \'(EXE) mode or in the IDE, this will allow us to
  \'use optimized code with unsigned integers in
  \'compiled mode without any overflow errors when
  \'running the code in the IDE
  On Local Error Resume Next
  m_RunningCompiled = ((2147483647 + 1) < 0)
 
End Sub


Avatar billede horus Nybegynder
12. februar 2001 - 11:58 #17
cstern,

Mange tak for hjælpen... jeg vil se nærmere på twofish - og det ender nok med at jeg benytter den løsning indtil videre... der er jo både en VB og en JAVA implementering, så der er lidt at arbejde med.... Desværre kunne jeg ikke finde nogen VB implementering af Rijndael nye AES, kun C løsninger.... men mon ikke det snart dukker op, nu ved jeg i hvert fald hvor jeg skal lede :-)

Du får lige en ordentlig stak point :-)

Horus

P.S.

Skulle du selv falde over en VB implementation af Rijndael AES, så hører jeg da MEGET gerne fra dig :-)

Avatar billede cstern Nybegynder
12. februar 2001 - 12:09 #18
jamen så siger jeg sandelig tusind tak...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester