je vous propose un 'petit' programme qui permets de transmettre des fichiers via tcp/ip de manière cryptée.
Il faut changer l'adresse ip dans le CLIENT (ligne 35) pour que cela corresponde au pc sur lequel le SERVEUR est lancé (j'ai pas fait d'interface pour rentrer l'adresse ip).
Pour l'instant, mes transferts entre PCs stagnent a 20 Mo/s.
Mais au moins, la NSA ne peut pas les décoder si elles interceptent les données

Ligne 75 : affiche_tranfert = 0 -> module image
affiche_tranfert = 1 -> module transfert
Mais bien sur, il y a un probleme.
Dans le 'module' d'affichage écran, au bout de quelques secondes, plus rien ne se récupère, et je ne sais pas pourquoi.Je n'ai aucun message d'erreur, aucun plantage.
Le code SERVEUR :
Code : Tout sélectionner
Enumeration
#file_to_read
#file_test
#directory
#show_picture
EndEnumeration
Declare determine_liste(client.l)
Declare.s key_create(ip.l)
Declare.s vect_create(ip.l)
Global wallpaper$
Structure store
clientid.l
in_progress.b
thread.l
ip_adress.l
waited_message.s
pause_thread.b
*buffer_x
EndStructure
Global NewList info_store.store()
If InitNetwork() = 0
MessageRequester("Erreur", "cannot initialise network.", 0)
End
EndIf
Port = 6839
Global buffer_size.l = 1048576
;Global SEvent.l
Global Dim Drive_Nom.s(25),nombre_disque
UseJPEGImageEncoder()
Procedure CaptureScreen(Left.l, Top.l, Width.l, Height.l)
hImage = CreateImage(#show_picture,Width,Height)
hDC = StartDrawing(ImageOutput(#show_picture))
DeskDC = GetDC_(GetDesktopWindow_())
BitBlt_(hDC,0,0,Width,Height,DeskDC,x,y,#SRCCOPY)
StopDrawing()
ReleaseDC_(GetDesktopWindow_(),DeskDC)
ResizeImage(#show_picture,1024/2,768/2)
SaveImage(#show_picture, "c:\Screenshot.jpg",#PB_ImagePlugin_JPEG,4)
FreeImage(#show_picture)
EndProcedure
Procedure.l data_receipt(client_number.l)
Protected received_size_buffer.l = 0
Protected memory_received.l = 0
Protected counter.l = 0
Protected *Buffer = AllocateMemory(buffer_size)
Protected *temporayr_buffer = AllocateMemory(buffer_size)
Repeat
FillMemory(*Buffer,buffer_size,0)
received_size_buffer = ReceiveNetworkData(client_number, *Buffer, buffer_size)
If received_size_buffer < 1
counter + 1
Goto fin_boucle_attente2
EndIf
If (memory_received + received_size_buffer) > buffer_size
memory_received = 0
EndIf
CopyMemory(*Buffer,*temporayr_buffer + memory_received,received_size_buffer)
memory_received + received_size_buffer
fin_boucle_attente2:
counter + 1
If counter > 1000
Break
EndIf
Until memory_received = buffer_size Or counter >= 1000
FillMemory(*Buffer,buffer_size,0)
CopyMemory(*temporayr_buffer,*Buffer,buffer_size)
FreeMemory(*temporayr_buffer)
determine_liste(client_number)
FillMemory(info_store()\buffer_x , buffer_size , 0)
CopyMemory(*Buffer , info_store()\buffer_x , buffer_size)
FreeMemory(*Buffer)
ProcedureReturn memory_received
EndProcedure
Procedure send_message(id_du_serveur.l,message$)
Protected *Buffer_envoi = AllocateMemory(buffer_size)
nombre_multiplication.l = Len(message$) / buffer_size
If Len(message$) % buffer_size = 0
nombre_multiplication - 1
EndIf
For i_envoi.l = 0 To nombre_multiplication
FillMemory(*Buffer_envoi,buffer_size,0)
If i_envoi = 0
PokeQ(*Buffer_envoi, Len(message$))
PokeS(*Buffer_envoi + 8, Mid(message$,1,buffer_size-8) )
Else
PokeS(*Buffer_envoi, Mid(message$,(i_envoi * buffer_size) - 7,buffer_size) )
EndIf
SendNetworkData(id_du_serveur, *Buffer_envoi,buffer_size)
Next i_envoi
FreeMemory(*Buffer_envoi)
*Buffer_envoi = 0
EndProcedure
Procedure GetAllDrives()
MaskDrive = GetLogicalDrives_()
Mask = 1
lpFileSystemNameBuffer.s = Space(256)
nombre_disque=0
For i.l = 65 To 97
If MaskDrive & Mask
wNom$=Chr(i)+":\"
wNom2$ = Chr(i) + ":"
wType=GetDriveType_(WNom$)
If wtype=#DRIVE_FIXED
nombre_disque=nombre_disque+1
Drive_Nom(nombre_disque)= wNom2$
EndIf
EndIf
Mask << 1
Next i
EndProcedure
Procedure.s enumere_repertoire(client_number,Directory$)
Protected Dim files_i_directory.s(10000)
Protected i_enumere.l = 0
Protected string_to_send.s = "<directory_send>"
Protected start_number.b
determine_liste(client_number)
FillMemory(info_store()\buffer_x,buffer_size)
start_enumere_repertoire:
If ExamineDirectory(#directory, Directory$, "*.*")
While NextDirectoryEntry(#directory)
If DirectoryEntryType(#directory) = #PB_DirectoryEntry_File ; si fichier
files_i_directory(i_enumere) = DirectoryEntryName(#directory)
i_enumere + 1
Else ; if directory
If start_number = 0 And DirectoryEntryName(#directory) <> "."
string_to_send + "?d.."
start_number = 1
EndIf
If DirectoryEntryName(#directory) <> "."
string_to_send + "?d" + DirectoryEntryName(#directory)
EndIf
EndIf
Wend
FinishDirectory(#directory)
For x_enumere = 0 To i_enumere-1
string_to_send + "?f" + files_i_directory(x_enumere) + "|" + Str(FileSize(Directory$ + files_i_directory(x_enumere)))
Next x_enumere
send_message(client_number,string_to_send)
ProcedureReturn string_to_send
Else ; cannot load directory
send_message(client_number,"<diretory_cannot_be_read><diretory_cannot_be_read>")
ProcedureReturn string_to_send
EndIf
EndProcedure
Procedure code_fichier(file_number.l, file_source_path.s ,client_id.l , s_fullname.s , special.l = 0)
size_of_file_to_received.l = FileSize(file_source_path)
If special = 0
message$ = "<FILE>" + s_fullname + "<FILE><SIZE>" + Str(size_of_file_to_received) + "<SIZE>"
Else
message$ = "<here_is_the_picture>" + Str(size_of_file_to_received) + "<here_is_the_picture>"
EndIf
total_file_size = Len(message$) + size_of_file_to_received
header_size = Len(message$)
ReadFile(file_number,file_source_path)
For i = 0 To (total_file_size/buffer_size)
FillMemory(info_store()\buffer_x,buffer_size,0)
If i = 0
PokeQ(info_store()\buffer_x,header_size )
PokeS(info_store()\buffer_x + 16,message$,header_size)
*CipheredString = AllocateMemory(buffer_size - header_size - 16)
FillMemory(*CipheredString,buffer_size - header_size - 16,0)
ReadData(file_number, *CipheredString, buffer_size - header_size - 16)
If FileSize(file_source_path) > buffer_size
p1.s = key_create(info_store()\ip_adress)
p2.s = vect_create(info_store()\ip_adress)
AESEncoder(*CipheredString, info_store()\buffer_x + header_size + 16, buffer_size - header_size - 16, @p1, 256, @p2 )
p1=Space(64)
p2=Space(64)
Else
If FileSize(file_source_path) < 16
p1.s = key_create(info_store()\ip_adress)
p2.s = vect_create(info_store()\ip_adress)
AESEncoder(*CipheredString, info_store()\buffer_x + header_size + 16, 16 , @p1, 256, @p2 )
p1=Space(64)
p2=Space(64)
Else
p1.s = key_create(info_store()\ip_adress)
p2.s = vect_create(info_store()\ip_adress)
AESEncoder(*CipheredString, info_store()\buffer_x + header_size + 16, FileSize(file_source_path), @p1, 256, @p2 )
p1=Space(64)
p2=Space(64)
EndIf
EndIf
crc32 = CRC32Fingerprint(info_store()\buffer_x + header_size + 16,buffer_size - header_size - 16)
PokeQ(info_store()\buffer_x + 8,crc32)
FreeMemory(*CipheredString)
Else
*CipheredString = AllocateMemory(buffer_size - 8)
ReadData(file_number, *CipheredString,buffer_size - 8)
p1.s = key_create(info_store()\ip_adress)
p2.s = vect_create(info_store()\ip_adress)
AESEncoder(*CipheredString, info_store()\buffer_x + 8, buffer_size - 8, @p1, 256, @p2 )
p1=Space(64)
p2=Space(64)
crc32 = CRC32Fingerprint(info_store()\buffer_x + 8, buffer_size - 8)
PokeQ(info_store()\buffer_x,crc32)
FreeMemory(*CipheredString)
EndIf
CRC_error_return:
SendNetworkData(client_id, info_store()\buffer_x,buffer_size)
FillMemory(info_store()\buffer_x,buffer_size,0)
info_store()\waited_message = "<received_block><received_block>"
info_store()\pause_thread = 1
While info_store()\pause_thread = 1
Delay(1)
Wend
Next i
EndProcedure
Procedure Scan_Directory(source.s, start_name.s, destination.s, client_id.l, rek = 0)
determine_liste(client_id)
If Right(source, 1) <> "\"
source + "\"
EndIf
If ExamineDirectory(rek, source, "*")
While NextDirectoryEntry(rek)
s_name.s = DirectoryEntryName(rek) : s_type = DirectoryEntryType(rek)
Select s_type
Case #PB_DirectoryEntry_File
s_fullname2.s = ReplaceString(source + s_name, destination + "\","")
s_fullname.s = start_name + "\" + s_fullname2
If IsFile(#file_to_read)
Debug "file already open !"
ElseIf code_fichier(#file_to_read, source + s_name, client_id , s_fullname) = 1
ProcedureReturn 1
EndIf
CloseFile(#file_to_read)
Case #PB_DirectoryEntry_Directory
If s_name <> "." And s_name <> ".."
If Scan_Directory(source + s_name, start_name, destination, client_id, rek + 1) = 1
ProcedureReturn 1
EndIf
EndIf
EndSelect
Wend
FinishDirectory(rek)
EndIf
EndProcedure
Procedure reception_donnee(client_number.l)
Protected file_number.l
Protected counter_erreur.l = 0
Protected received_size_buffer.l
Protected val_test.l = 0
determine_liste(client_number)
size_to_received.l = 0
received_size.l = 0
received_size_buffer.l = 0
final_size.l
; prepare si fichier a receptionner
For i_receiptdata = 0 To 1000
If Not IsFile(i_receiptdata)
file_number = i_receiptdata
Break
EndIf
Next i_receiptdata
counter_erreur= 0
suite_reception_donnee:
received_size_buffer = data_receipt(client_number)
Debug PeekS(info_store()\buffer_x + 8 , 50)
If counter_erreur > 10
If IsFile(file_number)
CloseFile(file_number)
EndIf
ProcedureReturn
EndIf
If received_size_buffer = -1
Delay(10)
counter_erreur + 1
Goto suite_reception_donnee
EndIf
size_to_received = PeekQ(info_store()\buffer_x)
CopyMemory(info_store()\buffer_x+8,info_store()\buffer_x,received_size_buffer-8)
; si <STRING>
If FindString(PeekS(info_store()\buffer_x) , "<STRING>",1) = 1
Debug "********************************"
Debug "<STRING>"
Debug "********************************"
CopyMemory(info_store()\buffer_x+8,info_store()\buffer_x,received_size_buffer-Len("<STRING>") )
received_size = received_size_buffer-Len("<STRING>")
Debug "client " + Str(client_number) + " send : " + PeekS(info_store()\buffer_x)
FillMemory(info_store()\buffer_x,buffer_size)
; si <FILE>
ElseIf FindString(PeekS(info_store()\buffer_x+8),"<FILE>") = 1
Debug "********************************"
Debug "<FILE>"
Debug "********************************"
EOF_waiting.b = 0
path$ = StringField(PeekS(info_store()\buffer_x + 8),2,"<FILE>")
path_1$ = Mid(path$ , 1,2)
placestring = 2
While StringField(path$ , placestring + 1, "\") <> ""
path_1$ + "\" + StringField(path$ , placestring, "\")
CreateDirectory(path_1$)
placestring + 1
Wend
Debug "path : " + path_1$
Debug CreateFile(file_number,StringField(PeekS(info_store()\buffer_x + 8),2,"<FILE>") )
size_to_received = Val(StringField(PeekS(info_store()\buffer_x + 8),2,"<SIZE>"))
received_size2.l = FindString( PeekS(info_store()\buffer_x + 8) , "<SIZE>", FindString( PeekS(info_store()\buffer_x + 8),"<SIZE>") + 4) + 5
size_to_remove = 16
final_size = 0
Repeat
crc32 = PeekL(info_store()\buffer_x)
CopyMemory(info_store()\buffer_x + 8 + received_size2,info_store()\buffer_x,buffer_size - received_size2 - size_to_remove)
crc32_calculate.l = CRC32Fingerprint(info_store()\buffer_x,buffer_size - size_to_remove - received_size2)
rajout_repertoire.s = ""
received_size = received_size_buffer
If crc32 <> crc32_calculate
send_message(client_number,"<ERREUR_CRC><ERREUR_CRC>")
Break
EndIf
*DecipheredString = AllocateMemory(received_size - size_to_remove - received_size2 + 1)
p1.s = key_create(info_store()\ip_adress)
p2.s = vect_create(info_store()\ip_adress)
AESDecoder(info_store()\buffer_x, *DecipheredString, received_size - size_to_remove - received_size2, @p1, 256, @p2)
p1=Space(64)
p2=Space(64)
If final_size + received_size - size_to_remove - received_size2 <= size_to_received
WriteData(file_number,*DecipheredString,received_size - size_to_remove - received_size2)
Else
WriteData(file_number,*DecipheredString,size_to_received - final_size)
EOF_waiting = 1
EndIf
FreeMemory(*DecipheredString)
FillMemory(info_store()\buffer_x,buffer_size)
final_size + received_size - size_to_remove - received_size2
send_message(client_number,"<received_block><received_block>")
FillMemory(info_store()\buffer_x,buffer_size)
received_size_buffer = data_receipt(client_number)
received_size2 = 0
size_to_remove = 8
Until EOF_waiting = 1
send_message(client_number,"<END>file<END>")
recuperation_fini = 1
CloseFile(file_number)
FillMemory(info_store()\buffer_x,buffer_size)
ElseIf FindString(PeekS(info_store()\buffer_x) , "<i_want_the_file>",1) = 1
Debug "********************************"
Debug "<i_want_the_file>"
Debug "********************************"
Debug "client " + Str(client_number) + " want the file : " + StringField(PeekS(info_store()\buffer_x),2,"<i_want_the_file>")
s_fullname.s = GetFilePart( StringField(PeekS(info_store()\buffer_x),2,"<i_want_the_file>") )
If IsFile(#file_to_read)
Debug "file already open !"
EndIf
If code_fichier(#file_to_read, StringField(PeekS(info_store()\buffer_x),2,"<i_want_the_file>") , client_number , s_fullname) = 1
Debug "STOP file"
EndIf
CloseFile(#file_to_read)
ElseIf FindString(PeekS(info_store()\buffer_x) , "<initial_list>",1) = 1
Debug "********************************"
Debug "<initial_list>"
Debug "********************************"
Debug "client " + Str(client_number) + " ask the directory <initial_list>"
GetAllDrives()
drive_tempo.s = "<initial_list>"
For i=1 To nombre_disque
drive_tempo = drive_tempo + "|" + Drive_Nom(i)
Next i
Debug "go"
message_a_envoyer.s = RemoveString(drive_tempo,"<initial_list>")
Debug "message size " + Str(Len(message_a_envoyer))
If Len(message_a_envoyer) < 16
message_a_envoyer = RSet(message_a_envoyer , 16 , " ")
EndIf
*CipheredString = AllocateMemory(Len(message_a_envoyer)+1)
determine_liste(client_number)
p1.s = key_create(info_store()\ip_adress)
p2.s = vect_create(info_store()\ip_adress)
AESEncoder(@message_a_envoyer, *CipheredString, Len(message_a_envoyer), @p1, 256, @p2 )
p1=Space(64)
p2=Space(64)
send_message(client_number,"<initial_list>" + PeekS(*CipheredString) + "<initial_list>")
FreeMemory(*CipheredString)
; liste repertoire
ElseIf FindString(PeekS(info_store()\buffer_x) , "<directory_listing>",1) = 1
Debug "********************************"
Debug "<directory_listing>"
Debug "********************************"
enumere_repertoire(client_number, StringField(PeekS(info_store()\buffer_x),2,"<directory_listing>"))
FillMemory(info_store()\buffer_x,buffer_size)
; enumere repertoire pour renvoi
ElseIf FindString(PeekS(info_store()\buffer_x) , "<i_want_the_directory>",1) = 1
Debug "********************************"
Debug "<i_want_the_directory>"
Debug "********************************"
If Scan_Directory(StringField(PeekS(info_store()\buffer_x),2,"<i_want_the_directory>") ,StringField(PeekS(info_store()\buffer_x),2,"<will_be_sent_in>") , StringField(PeekS(info_store()\buffer_x),2,"<i_want_the_directory>"), client_number, 0) = 1
Debug "ARRETE TRANSFERT"
EndIf
; renvoi l'image
ElseIf FindString(PeekS(info_store()\buffer_x) , "<ask_picture>",1) = 1
Debug "********************************"
Debug "<ask_picture>"
Debug "********************************"
CaptureScreen(0,0,1024,768)
If code_fichier(#file_to_read, "c:\Screenshot.jpg" , client_number , "" , 1) = 1
Debug "STOPPE FICHIER"
EndIf
CloseFile(#file_to_read)
info_store()\waited_message = "<picture_received><picture_received>"
info_store()\pause_thread = 1
While info_store()\pause_thread = 1
Delay(1)
Wend
Else
Debug "peeks inconnu " + PeekS(info_store()\buffer_x)
EndIf
quittage:
If IsFile(file_number)
CloseFile(file_number)
EndIf
Debug "clear info_store"
determine_liste(client_number)
FreeMemory(info_store()\buffer_x)
DeleteElement( info_store() )
EndProcedure
Procedure test_if_no_more_client()
ForEach info_store()
If info_store()\in_progress = 1
ProcedureReturn
EndIf
Next
SystemParametersInfo_ ( #SPI_SETDESKWALLPAPER , 0, wallpaper$, #SPIF_UPDATEINIFILE | #SPIF_SENDWININICHANGE ) ; retire papier peinds
EndProcedure
Procedure determine_liste(client.l)
Protected adresse.s
ForEach info_store()
If client = info_store()\clientid
ProcedureReturn
EndIf
Next
AddElement( info_store() )
info_store()\clientid = client
info_store()\ip_adress = GetClientIP(client)
info_store()\buffer_x = AllocateMemory(buffer_size)
EndProcedure
Procedure.s key_create(ip.l)
message_temp.s
While Len(message_temp) < 64
message_temp + Str( ip )
Wend
ProcedureReturn Mid(message_temp,1,32)
EndProcedure
Procedure.s vect_create(ip.l)
message_temp.s
While Len(message_temp) < 64
message_temp + Str( ip )
Wend
ProcedureReturn Mid(message_temp,33,32)
EndProcedure
If CreateNetworkServer(0, Port)
Repeat
Delay(1)
SEvent = NetworkServerEvent()
If SEvent
ClientID = EventClient()
If SEvent = #PB_NetworkEvent_Disconnect
Debug "end of connexion for client " + Str(ClientID)
test_if_no_more_client()
Goto fin_boucle
EndIf
determine_liste(ClientID)
If info_store()\in_progress = 1 And info_store()\thread <> 0 And info_store()\pause_thread = 1
Goto suite_boucle_p
ElseIf info_store()\in_progress = 1 And info_store()\thread <> 0
Goto fin_boucle
EndIf
suite_boucle_p:
If SEvent = #PB_NetworkEvent_Connect
Debug "New connexion of " + Str(ClientID)
wallpaper$ = Space(260)
SystemParametersInfo_ ( #SPI_GETDESKWALLPAPER , Len(wallpaper$), wallpaper$, 0 )
SystemParametersInfo_ ( #SPI_SETDESKWALLPAPER , 0, "", #SPIF_UPDATEINIFILE | #SPIF_SENDWININICHANGE ) ; retire papier peinds
determine_liste(ClientID)
send_message(ClientID,"<client_number>" + Str(ClientID) + "<client_number>")
ElseIf SEvent = #PB_NetworkEvent_Data
; Debug "RECEPTION CLIENT"
determine_liste(ClientID)
info_store()\in_progress = 1
If info_store()\thread = 0
Debug "THREAD"
info_store()\thread = CreateThread(@reception_donnee(),ClientID)
ElseIf info_store()\pause_thread = 1
Debug "in wait for : " + info_store()\waited_message
received_size_buffer = data_receipt(ClientID)
If FindString(PeekS(info_store()\buffer_x+8 , received_size_buffer-8) , info_store()\waited_message ) = 1
info_store()\pause_thread = 0
info_store()\waited_message = ""
Else
Debug "passe a autre chose"
info_store()\pause_thread = 0
Goto fin_boucle
EndIf
EndIf
ElseIf SEvent = #PB_NetworkEvent_Disconnect
Debug "End of connexion " + Str(ClientID)
test_if_no_more_client()
EndIf
EndIf
fin_boucle:
Until Quit = 1
CloseNetworkServer(0)
Else
MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf