webForumDet fria alternativet

Kryptera och sånt

ASPur ASP

24 svar · 1 017 visningar · startad av CatZ

CatZMedlem sedan jan. 20022 440 inlägg
#1

Hittade följande kodsnutt på 4guysFromRolla

<%
Dim g_KeyLocation, g_Key

g_KeyLocation = "C:\crypt\" & BuildFileName() & ".txt"

Const g_CryptThis = "4GuysFromRolla.com Rocks"
Const g_KeyLen = 512

On Error Resume Next

strFullKey = KeyGeN(g_KeyLen)

Call WriteKeyToFile(strFullKey)

if Err <> 0 Then
	Response.Write "ERROR GENERATING KEY" & "<p>"
	Response.Write Err.Number & "<br />"
	Response.Write Err.Description & "<br />"  
Else
	Response.Write "KEY SUCCESSFULLY GENERATED"
End If

Sub WriteKeyToFile(MyKeyString)
   Dim keyFile, fso, strFileName
   strFileName = g_KeyLocation
   set fso = Server.CreateObject("scripting.FileSystemObject") 
   set keyFile = fso.CreateTextFile(strFileName, true) 
   keyFile.WriteLine(MyKeyString)
   keyFile.Close
End Sub

Function KeyGeN(iKeyLength)
Dim k, iCount, strMyKey, lowerbound, upperbound
   lowerbound = 35 ' 35
   upperbound = 96 ' 96
   Randomize      ' Initialize random-number generator.
   for i = 1 to iKeyLength
      s = 255
      k = Int(((upperbound - lowerbound) + 1) * Rnd + lowerbound)
      strMyKey =  strMyKey & Chr(k) & ""
   next
   KeyGeN = strMyKey
End Function

Function BuildFileName()
	Dim k, i,  strFileName, lowerbound, upperbound
	lowerbound = 97
	upperbound = 122
	Randomize
	for i = 1 to 24
		k = Int(((upperbound - lowerbound) + 1) * Rnd + lowerbound)
		strFileName =  strFileName & Chr(k) & ""
	next
	BuildFileName = strFileName
End Function

g_Key = mid(ReadKeyFromFile(g_KeyLocation),1,Len(g_CryptThis))

Function EnCrypt(strCryptThis)
	Dim strChar, iKeyChar, iStringChar, i
	for i = 1 to Len(strCryptThis)
		iKeyChar = Asc(mid(g_Key,i,1))
		iStringChar = Asc(mid(strCryptThis,i,1))
		iCryptChar = iKeyChar Xor iStringChar
		strEncrypted =  strEncrypted & Chr(iCryptChar)
	next
	EnCrypt = strEncrypted
End Function

Function DeCrypt(strEncrypted)
	Dim strChar, iKeyChar, iStringChar, i
	for i = 1 to Len(strEncrypted)
		iKeyChar = (Asc(mid(g_Key,i,1)))
		iStringChar = Asc(mid(strEncrypted,i,1))
		iDeCryptChar = iKeyChar Xor iStringChar
		strDecrypted =  strDecrypted & Chr(iDeCryptChar)
	next
	DeCrypt = strDecrypted
End Function

Function ReadKeyFromFile(strFileName)
   Dim keyFile, fso, f
   set fso = Server.CreateObject("Scripting.FileSystemObject") 
   set f = fso.GetFile(strFileName) 
   set ts = f.OpenAsTextStream(1, -2)

   Do While not ts.AtEndOfStream
     keyFile = keyFile & ts.ReadLine
   Loop 

   ReadKeyFromFile =  keyFile
End Function
%>

Vad jag däremot inte hittar är information om hur jag tillämpar detta. Någon som har använt sig av detta och kan förklara hur jag implementerar detta eller kan dela med sig av något annat bra sätt att krypera och dekryptera information på?

Det hela är en artikel på 3 delar som hänger ihop och en fristående om nå querystring tjosan

aspMedlem sedan aug. 2002733 inlägg
#2

""

@ndersMedlem sedan juni 200032 969 inlägg
#3

Synnerligen informativt inlägg, asp.

- - -

CatZ, har du en länk till 4guysfromrolla där du tagit koden ifrån?

mvh

Jesper TMedlem sedan nov. 20017 144 inlägg
#4

Nåt sånt här kanske:

Dim minText, minTextKrypterad, minTextDekrypterad

minText = "Detta är texten som skall bli hemlig"

'Kryptera
minTextKrypterad = EnCrypt(minText)

'Skriv ut den krypterade texten 
Response.write "Kjyptejat: " & minTextKrypterad & "<br>"

'Dekryptera
minTextDekrypterad = DeCrypt(minTextKrypterad)

'Skriv ut den dekrypterade texten 
Response.write "Dekjyptejat: " & minTextDekrypterad & "<br>"
CatZMedlem sedan jan. 20022 440 inlägg
#5

Japp @nders, jag antar att det är ett sånt där vi får inte posta kod från andra sidor utan att länka till källan läge? Ber så mycket om ursäkt för det i så fall och ska genast leta upp en giltig länk.

Ville bara lite snabbt dela med mig av något som jag tyckte verka vettigt, och få lite hjälp att tillämpa det :)

@ndersMedlem sedan juni 200032 969 inlägg
#6

Japp @nders, jag antar att det är ett sånt där vi får inte posta kod från andra sidor utan att länka till källan läge? Ber så mycket om ursäkt för det i så fall och ska genast leta upp en giltig länk.

Nej, inte alls! Jag skulle mest vilja läsa artikeln för att se om jag kunde hjälpa dig att tillämpa det! :)

Jag ska försöka hinna med att titta på det idag. :)

mvh

OveRRidEMedlem sedan feb. 200112 078 inlägg
#7

Exakt vad ska du använda krypteringen till? Kryptera querystrings? Textdata? Ska det lagras i databas?

CatZMedlem sedan jan. 20022 440 inlägg
#8

Jag ska göra lite av varje faktiskt. En del information i databasen och en del querystrings osv. Det är lite känslig information så jag behöver något hyffsat skarpt :)

OveRRidEMedlem sedan feb. 200112 078 inlägg
#9

Ja, enligt artikeln är ju algoritmen av någon som heter David Mann;

4guys skrev:

algorithm provided by David Mann

. Jag har ingen aning om hur stark det där kryptot blir, men jag är tveksam till att det är tillräckligt.

Kika på något annat kanske, t.ex. RC4? Har du möjlighet att installera komponenter på servern eller måste du har en ASP-implementation?

CatZMedlem sedan jan. 20022 440 inlägg
#10

RC4? Du menar något sånt här?

Function RC4(ByRef pStrMessage, ByRef pStrKey)

	Dim lBytAsciiAry(255)
	Dim lBytKeyAry(255)
	Dim lLngIndex
	Dim lBytJump
	Dim lBytTemp
	Dim lBytY
	Dim lLngT
	Dim lLngX
	Dim lLngKeyLength
	
	' Validate data
	If Len(pStrKey) = 0 Then Exit Function
	If Len(pStrMessage) = 0 Then Exit Function

	' transfer repeated key to array
	lLngKeyLength = Len(pStrKey)
	For lLngIndex = 0 To 255
	    lBytKeyAry(lLngIndex) = Asc(Mid(pStrKey, ((lLngIndex) Mod (lLngKeyLength)) + 1, 1))
	Next

	' Initialize S
	For lLngIndex = 0 To 255
	    lBytAsciiAry(lLngIndex) = lLngIndex
	Next

	' Switch values of S arround based off of index and Key value
	lBytJump = 0
	For lLngIndex = 0 To 255
	
		' Figure index to switch
	    lBytJump = (lBytJump + lBytAsciiAry(lLngIndex) + lBytKeyAry(lLngIndex)) Mod 256
	    
	    ' Do the switch
	    lBytTemp				= lBytAsciiAry(lLngIndex)
	    lBytAsciiAry(lLngIndex)	= lBytAsciiAry(lBytJump)
	    lBytAsciiAry(lBytJump)	= lBytTemp
	    
	Next

	
	lLngIndex = 0
	lBytJump = 0
	For lLngX = 1 To Len(pStrMessage)
	    lLngIndex = (lLngIndex + 1) Mod 256 ' wrap index
	    lBytJump = (lBytJump + lBytAsciiAry(lLngIndex)) Mod 256 ' wrap J+S()
	    
		' Add/Wrap those two	    
	    lLngT = (lBytAsciiAry(lLngIndex) + lBytAsciiAry(lBytJump)) Mod 256
	    
	    ' Switcheroo
	    lBytTemp				= lBytAsciiAry(lLngIndex)
	    lBytAsciiAry(lLngIndex)	= lBytAsciiAry(lBytJump)
	    lBytAsciiAry(lBytJump)	= lBytTemp

	    lBytY = lBytAsciiAry(lLngT)
	
		' Character Encryption ...    
	    RC4 = RC4 & Chr(Asc(Mid(pStrMessage, lLngX, 1)) Xor lBytY)
	Next
	
End Function

Och

<%Option Explicit%>

<%
Dim lStrKey
Dim lStrMessage
Dim lStrResult
If Not Request.Form = "" Then
	lStrKey = Request.Form("Key")
	lStrMessage = Request.Form("Message")
	lStrResult = RC4(lStrMessage, lStrKey)
End If
%>
<HTML>
	<HEAD>
		<TITLE>RC4 Encryption</TITLE>
	</HEAD>
	<BODY>
		<H1>RC4 Encryption</H1>
		<P>
			This script encrypts and decrypts messages with the RC4
			algorithm.  Enter the key (password) and a message to
			encrypt or decrypt in the fields below.
		</P>
		<FORM method="Post">
			Key: <INPUT name="Key" value="<%=Server.HTMLEncode(lStrKey)%>"><BR>
			<BR>
			Message:<BR>
			<TEXTAREA name="Message" rows="6" cols="50"><%=Server.HTMLEncode(lStrResult)%></TEXTAREA>
			<BR>
			<INPUT type="Submit" value="Apply RC4">
		</FORM>
		<P>
			Created by <A href="http://www.lewismoten.com">Lewis Moten</A>.
			If you have questions about RCA and the algorithms
			that were released to the public domain, you can read the
			<A href="http://www.rsasecurity.com/solutions/developers/total-solution/faq.html">FAQ</A>.
		</P>
	</BODY>
</HTML>

Skulle RC4 vara bättre? Tillämpningen här verkar ju lite enklare ialla fall :)

För tillfället har jag full kontroll över servern men jag är nästan helt säker på att vi kommer köpa serverutrymme hos någon i framtiden. Därför vill jag inte styra upp mig för mycket vid att installera saker.

OveRRidEMedlem sedan feb. 200112 078 inlägg
#11

Jag ska inte ge mig in på att bedöma huruvida RC4 är den bästa algoritmen av alla för kryptering, men jag kan ganska lätt sätta en arm på att den är bättre än den kod du hittade på 4guysfromrolla. ;)

CatZMedlem sedan jan. 20022 440 inlägg
#12

Jag litar på er experter, hade varit kul att höra vad @nders har att säga också! Inte det att jag misstror dig OveRRidE men det är faktiskt "Cipher själv" som kommit på det hela:

4GaysFromRolla skrev:

The Vernam Cipher was invented by none other than Gilbert Vernam (he was an AT&T engineer), in 1918. The ciphertext is generated by combining ASCII plaintext with a "one-time pad" or key. The key is combined with the plaintext stream by mod 2 (Xor), thus creating the encrypted cyphertext.

Det de använder ska bara vara en modifierad variant av det.

OveRRidEMedlem sedan feb. 200112 078 inlägg
#13

Kanske blir jag nu av med en arm. ;)

Nu är ju som sagt jag verkligen inte någon expert på kryptografi, men så som jag nu har förstått det är RC4 (såsom många andra krypton) baserat på "The Vernam Cipher", fast med vissa (mer avancerade) skillnader (?).

Det sägs ju idag att RC4 är osäkert och helst inte ska användas, så jag antar att jag får ta tillbaks det där uttalandet. Intressant att notera är dock att RC4 används i bl.a. WEP och (om man vill) SSL.

Nu när jag tittar på koden och funderar lite på hur streamkrypton fungerar med "the-one time pad cipher", så är ju faktiskt den kod du hänvisar till bättre, eftersom den genererar en ny slumpmässig nyckel varje gång funktionen körs. Den "RC4"-kod som du senare visare har en fördefinerad nyckel, verkar det som.

Kan någon som är duktig på kryptografi kanske hjälpa till lite? :D

OveRRidEMedlem sedan feb. 200112 078 inlägg
#14

Okej, nu har jag kikat lite närmare på det där scriptet från 4guysfromrolla och det var en aning förvirrande till en början.

Scriptet genererar en ny nyckel vid varje tillfälle som man använder scriptet (dock inte varje gång Encrypt() körs) och placerar den i en textfil på servern med FSO, en fil vars filnamn är slumpmässigt genererat och som (antagligen, det framgår inte i kod) placeras i en sessionvariabel/-cookie. Du använder sedan (när du kör Decrypt() alltså) samma nyckel för att dekryptera med och nästa gång du använder scriptet görs en ny nyckel och cirkeln börjar om.

Alltså; det känns mest anpassat för att temporärskydda t.ex. querystrings med, eftersom varje användare får en unik nyckel som lagras på disk, vid varje tillfälle data krypteras. Referensen till denna nyckel får ses som högst tillfällig, sålänge den inte hamnar i t.ex. en databas (vilket den måste om du t.ex. ska kryptera data som ska läsas ut vid ett annat tillfälle, t.ex. några dagar senare).

Ja, det går väl att göra på många sätt antar jag. Det där är iallafall ett onödigt starkt sätt att kryptera qs's på, enligt mig. ;)

CatZMedlem sedan jan. 20022 440 inlägg
#15

Jo men om jag vill kryptera information i databasen då? Min tanke var att ha en accessdatabas där jag sparar "textfilen" och kryptera informationen som sparas i SQL servern.

Har den den allvetande @nden något att säga om det här? ;)

Om jag ska vara helt ärlig vill jag nog bara lära mig det här för framtida bruk! ;) Det borde ju gå tillämpa i .net också även om .net har en del inbyggt stöd för kryptering.

@ndersMedlem sedan juni 200032 969 inlägg
#16

CatZ skrev:

Har den den allvetande @nden något att säga om det här?

Ska det vara jag det? :)

Nja, vet inte riktigt. Jag tycker Override är en bra diskussionskompis för dig i denna tråd. ;)

Mvh

OveRRidEMedlem sedan feb. 200112 078 inlägg
#17

CatZ skrev:

Jo men om jag vill kryptera information i databasen då? Min tanke var att ha en accessdatabas där jag sparar "textfilen" och kryptera informationen som sparas i SQL servern.

Har den den allvetande @nden något att säga om det här? ;)

Ja, du har väl egentligen ett par alternativ;

  1. Du använder en global nyckel, som alla delar i hela applikationen. Denna nyckel är hemlig och lagras lämpligtvis i t.ex. Application. Den används vid all kryptering/dekryptering av alla användare, på all data.
  2. Du använder en personlig nyckel för varje användare. Denna nyckel är specifikt genererad för varje användare och lagras tillsammans med deras användardata i en resistent datakälla, som t.ex. en databas. Den används för att kryptera/dekryptera den specifika användarens data och ingen annans.

Ett alternativ att att göra nya nycklar vid varje "tillfälle" blir inget alternativ vid permanent lagring i t.ex. databas, eftersom nyckeln isåfall måste fästas vid datan, eftersom ny nyckel kommer genereras vid varje kryptering. Av förklarliga skäl blir detta väldigt.. ja, dumt. Jag ser iallafall inte nåt smidigt sätt att lösa det på just nu.

Personligen skulle jag nog använda alternativ 2 i båda fallen, om du vill vara riktigt noga.

CatZMedlem sedan jan. 20022 440 inlägg
#18

Jag är rätt förvånad hur lite som krypteras på kodnivå, finns det egentligen någon använding för det?Köper man och installerar ordentligt skarpa komponenter på servern och kör dessutom med https?

Antar att det är svårare att hacka en MySQL eller SQL server, de flesta webservrar tillåter ju att man helt enkelt tankar hem en accessDB, då finns det ju större behov av att kryptera lösenord osv. Hanterar man kunder eller användare så är det ju också viktigt att säkra deras information. Många använder ju samma användarnamn lösenord till det mesta.

Räcker det med https? Jag vill gärna kryptera vissa fält även i SQL databasen, så som mitt egna lösenord. Chefen han kunde inte bry sig mindre, jag har full tillgång till hans visakort alla hans lösenord osv. Jag tycker dock att det är lite obehagligt att alls ha tillgång till sådan information, varför jag gärna vill kryptera den ni vet så man har ryggen fri.

Jesper T skrev:

Nåt sånt här kanske:

Dim minText, minTextKrypterad, minTextDekrypterad

minText = "Detta är texten som skall bli hemlig"

'Kryptera
minTextKrypterad = EnCrypt(minText)

'Skriv ut den krypterade texten 
Response.write "Kjyptejat: " & minTextKrypterad & "<br>"

'Dekryptera
minTextDekrypterad = DeCrypt(minTextKrypterad)

'Skriv ut den dekrypterade texten 
Response.write "Dekjyptejat: " & minTextDekrypterad & "<br>"

JAg ska experimentera lite med det där. Vad jag inte förstår är dock hur fasen jag ska använda mig av textfilen som skapas.

OveRRidE? Du förstod texten bättre än mig: Hur används textfilerna?

CatZMedlem sedan jan. 20022 440 inlägg
#19

OveRRidE skrev:

[2]Du använder en global nyckel, som alla delar i hela applikationen. Denna nyckel är hemlig och lagras lämpligtvis i t.ex. Application. Den används vid all kryptering/dekryptering av alla användare, på all data.
Du använder en personlig nyckel för varje användare. Denna nyckel är specifikt genererad för varje användare och lagras tillsammans med deras användardata i en resistent datakälla, som t.ex. en databas. Den används för att kryptera/dekryptera den specifika användarens data och ingen annans.

Kan man modifiera koden på något vis så att den körs en gång för tex varje unik användare? Mina kunskaper räcker föga till sånt här, jag klarar knappt av det där med Const, Class och public :P

/Mot ett högre vetande

OveRRidEMedlem sedan feb. 200112 078 inlägg
#20

Jag tror JesperT's förklaring är vad man brukar kalla för Psuedo-kod, alltså bara ett syntaxmässigt exempel. :)

CatZ skrev:

Räcker det med https? Jag vill gärna kryptera vissa fält även i SQL databasen, så som mitt egna lösenord. Chefen han kunde inte bry sig mindre, jag har full tillgång till hans visakort alla hans lösenord osv. Jag tycker dock att det är lite obehagligt att alls ha tillgång till sådan information, varför jag gärna vill kryptera den ni vet så man har ryggen fri.

SSL (eller "https") brukar vara tillräckligt, såvida man inte är rädd för att någon fysiskt ska lägga beslag på din data och sen försöka knäcka krypteringen.

Känsliga uppgifter som t.ex. kortnummer bör man kryptera om man kan. Se bara till att hålla koll på nycklarna! Krypteringen är inte säkrare än att nyckeln måste hållas hemlig. Dessutom vill du helst inte förlora nycklarna heller, då blir din data ganska värdelös. :OO

Lösenord däremot, krypterar man inte, de hashar man. Lämpligen används MD5 för detta ändamål. Hashning kan du läsa mer om på wF om du söker i forumen.

143 ms totalt · 3 externa anrop · v20260731065814-full.c74b5be1
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)