472,780 Members | 1,595 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,780 software developers and data experts.

Encrypted File Transfer

Hi all,

the following problem occured to me and I hope somebody can
help me :

I need to implement an encrypted File download with
a PHP script on the server side and a c# client application.

I know there is a way to symmetrically encrypt files
with the php mcrypt routines and already did implement a
protocol based on xml for querying files from the
server.

So the problem is, I need to generate and exchange a
random key for each transfer. This is possible,
for example, with the Diffie-Hellman Key Exchange
Procedure. Because I found nothing about this
procedure in the php function list, I began
to implement it myself.

The problem in this case is that I need arithmetic
support for Big Numbers (>=1024 Bits). The bc* functions
are too slow and do not work in this case. An alternative
would be the GMP Library, which is not supported by the
ISP where the script will be running.

Setting up my own Server with GMP support is no alternative either in
this case.

So perhaps anybody knows how I could achieve an encrypted
file download with different keys for every "Download Session" in
php. Is it possible over an ssl / https connection ? Or what am I
missing here ?

I would be very grateful for any hints, tips, sugesstions, points
to existing code...

Many thanks in advance,

Philipp

Jul 17 '05 #1
8 5467
"Philipp Brune" <ph***********@t-online.de> wrote in message
news:cs*************@news.t-online.com...
Hi all,

the following problem occured to me and I hope somebody can
help me :

I need to implement an encrypted File download with
a PHP script on the server side and a c# client application.

I know there is a way to symmetrically encrypt files
with the php mcrypt routines and already did implement a
protocol based on xml for querying files from the
server.

So the problem is, I need to generate and exchange a
random key for each transfer. This is possible,
for example, with the Diffie-Hellman Key Exchange
Procedure. Because I found nothing about this
procedure in the php function list, I began
to implement it myself.

The problem in this case is that I need arithmetic
support for Big Numbers (>=1024 Bits). The bc* functions
are too slow and do not work in this case. An alternative
would be the GMP Library, which is not supported by the
ISP where the script will be running.

Setting up my own Server with GMP support is no alternative either in
this case.

So perhaps anybody knows how I could achieve an encrypted
file download with different keys for every "Download Session" in
php. Is it possible over an ssl / https connection ? Or what am I
missing here ?

I would be very grateful for any hints, tips, sugesstions, points
to existing code...


Can't rely on a shared secret?
Jul 17 '05 #2
Philipp Brune <ph***********@t-online.de> wrote:
The problem in this case is that I need arithmetic
support for Big Numbers (>=1024 Bits). The bc* functions
are too slow and do not work in this case.
The encryption doesn't have to be strong if you use SSL for the actual
transer. A weak onetime keypair has to be strong enough to allow the
transfer to complete before you can reasonably assume someone had the
processor time to crack it.

But is the openssl module (http://nl3.php.net/openssl) available on the
target server?
So perhaps anybody knows how I could achieve an encrypted
file download with different keys for every "Download Session" in
php. Is it possible over an ssl / https connection ? Or what am I
missing here ?


What is the quest? Should the file to download be encrypted during
transfer or should an encrypted file be downloaded to a client?

In the first case SSL is good enough but you could use DH key exchange
for authtication for additional security. I don't see the practical
point of the latter case.

Jul 17 '05 #3
Chung Leong schrieb:
"Philipp Brune" <ph***********@t-online.de> wrote in message
news:cs*************@news.t-online.com...
Hi all,

the following problem occured to me and I hope somebody can
help me :

I need to implement an encrypted File download with
a PHP script on the server side and a c# client application.

I know there is a way to symmetrically encrypt files
with the php mcrypt routines and already did implement a
protocol based on xml for querying files from the
server.

So the problem is, I need to generate and exchange a
random key for each transfer. This is possible,
for example, with the Diffie-Hellman Key Exchange
Procedure. Because I found nothing about this
procedure in the php function list, I began
to implement it myself.

The problem in this case is that I need arithmetic
support for Big Numbers (>=1024 Bits). The bc* functions
are too slow and do not work in this case. An alternative
would be the GMP Library, which is not supported by the
ISP where the script will be running.

Setting up my own Server with GMP support is no alternative either in
this case.

So perhaps anybody knows how I could achieve an encrypted
file download with different keys for every "Download Session" in
php. Is it possible over an ssl / https connection ? Or what am I
missing here ?

I would be very grateful for any hints, tips, sugesstions, points
to existing code...

Can't rely on a shared secret?


Many thanks for your Reply !

But if you mean that Server and Client should agree
upon a key once and each store that key to be used
for every download session they will ever do, that
is not what I want.

A new Key for every Download is what I would appreciate !
Jul 17 '05 #4
Daniel Tryba schrieb:
Philipp Brune <ph***********@t-online.de> wrote:
The problem in this case is that I need arithmetic
support for Big Numbers (>=1024 Bits). The bc* functions
are too slow and do not work in this case.

The encryption doesn't have to be strong if you use SSL for the actual
transer. A weak onetime keypair has to be strong enough to allow the
transfer to complete before you can reasonably assume someone had the
processor time to crack it.

But is the openssl module (http://nl3.php.net/openssl) available on the
target server?

So perhaps anybody knows how I could achieve an encrypted
file download with different keys for every "Download Session" in
php. Is it possible over an ssl / https connection ? Or what am I
missing here ?

What is the quest? Should the file to download be encrypted during
transfer or should an encrypted file be downloaded to a client?

In the first case SSL is good enough but you could use DH key exchange
for authtication for additional security. I don't see the practical
point of the latter case.


First of all, many thanks for your reply !

Well yes, the Provider has installed the OpenSSL module
on the Server, great !

To be more specifically, this is what I want to Achive :

1) Client and Server agree upon a one-time-key.
2) The Client POSTs an Xml String to the Server
in which he tells what file he wants to Download
and some additional Information :

<query filetodownload="abc.def" package="packageoffile">
<account>
<username>Philipp</username>
<password>mypass</password>
</account>
</query>

This POST should also be encrypted with the previously
agreed key.

3) Someone has Stored the file "abc.def" in unencrypted
form in a specific Directory (Protected by an .htaccess file)
on the Server before.

4) The Server Opens the file, encrypts the Data with the
key Exchanged in 1) and sends it to the Client.

5) The Client Decrypts the Data and stores it in a specific
Location.

There were two thougts came in my mind while I was reading your answer :

First, the Download of a file may take up to 30 minutes, for this
short time a smaller key of 128 Bit perhaps could not be cracked
I suppose. So I am going to test, if the bcmath functions
work with this.

Secondly, perhaps the whole Session (Step 1-5) could be
(semi-)transparently encrypted with ssl.
So I would like to know how this could be done, if possible !

Or if it would just be possible to exchange the key over ssl this would
be great! How can this be done ?

Perhaps something like this :

Server & Client establish HTTPS Connection.
Client POSTs a number of randomly generated
bytes to the Server.
The Server Replies with another number of
randomly generated bytes.
Both Quit the HTTPS Connection and
Calculate a Key with the Exchanged Bytes, perhaps
with a simple XOR or something like that.

Would this make sense ? How could it be done ?

Many thanks in advance for any help, suggestions, hints !


Jul 17 '05 #5
Philipp Brune <ph***********@t-online.de> wrote:
There were two thougts came in my mind while I was reading your answer :

First, the Download of a file may take up to 30 minutes, for this
short time a smaller key of 128 Bit perhaps could not be cracked
I suppose. So I am going to test, if the bcmath functions
work with this.
The data itself should offcourse be strongly encrypted.
Secondly, perhaps the whole Session (Step 1-5) could be
(semi-)transparently encrypted with ssl.
So I would like to know how this could be done, if possible !
Ehhh, step 1 thru 5 are essentially SSL.
Or if it would just be possible to exchange the key over ssl this would
be great! How can this be done ?
https (http over ssl) is transparant, your PHP script and C# client
communicate just like any other http client/server. The client does a
for example a POST, the C# http/crypto libs will setup a secure
connection (I'd guess they use DH for that) to the webserver, which
invokes PHP. All data send from PHP will be over the already encrypted
socket back to the client. A typical encryption would be something like
AES-256 (which is symmetric)
Perhaps something like this :

Server & Client establish HTTPS Connection.
Client POSTs a number of randomly generated
bytes to the Server.
The Server Replies with another number of
randomly generated bytes.
Both Quit the HTTPS Connection and
Calculate a Key with the Exchanged Bytes, perhaps
with a simple XOR or something like that.

Would this make sense ? How could it be done ?


If you can use SSL this doesn't make any sense (way to complicated :).
SSL does the encryption (transparant), so all you have to do is
authenticate the client:

1-server/client establish https connection
2-client authenticates somehow (could be plaintext challenge/response)
3-server pushes file over existing socket

step 1 is handled by the actual webserver and the cryptolibraries on the
client
step 2 could be anything you want, from simple text passwords to RSA
step 3 could be a simple readfile() in PHP in response to a successfull
step 2

Alternatively (depending on how the client program get distributed) you
could do authentication with SSL by using self generated client certificates
(some kind of activation after install).
Jul 17 '05 #6
Daniel Tryba schrieb:
Philipp Brune <ph***********@t-online.de> wrote:
There were two thougts came in my mind while I was reading your answer :

First, the Download of a file may take up to 30 minutes, for this
short time a smaller key of 128 Bit perhaps could not be cracked
I suppose. So I am going to test, if the bcmath functions
work with this.

The data itself should offcourse be strongly encrypted.


You are right, weak encryption is not what i should do to
minimize programming effort :-)
Secondly, perhaps the whole Session (Step 1-5) could be
(semi-)transparently encrypted with ssl.
So I would like to know how this could be done, if possible !

Ehhh, step 1 thru 5 are essentially SSL.

Or if it would just be possible to exchange the key over ssl this would
be great! How can this be done ?

https (http over ssl) is transparant, your PHP script and C# client
communicate just like any other http client/server. The client does a
for example a POST, the C# http/crypto libs will setup a secure
connection (I'd guess they use DH for that) to the webserver, which
invokes PHP. All data send from PHP will be over the already encrypted
socket back to the client. A typical encryption would be something like
AES-256 (which is symmetric)

Perhaps something like this :

Server & Client establish HTTPS Connection.
Client POSTs a number of randomly generated
bytes to the Server.
The Server Replies with another number of
randomly generated bytes.
Both Quit the HTTPS Connection and
Calculate a Key with the Exchanged Bytes, perhaps
with a simple XOR or something like that.

Would this make sense ? How could it be done ?

If you can use SSL this doesn't make any sense (way to complicated :).
SSL does the encryption (transparant), so all you have to do is
authenticate the client:

1-server/client establish https connection
2-client authenticates somehow (could be plaintext challenge/response)
3-server pushes file over existing socket

step 1 is handled by the actual webserver and the cryptolibraries on the
client
step 2 could be anything you want, from simple text passwords to RSA
step 3 could be a simple readfile() in PHP in response to a successfull
step 2

Alternatively (depending on how the client program get distributed) you
could do authentication with SSL by using self generated client certificates
(some kind of activation after install).

Yes, I suppose the best solution is to use SSL, why reinvent the wheel ?
I think the client-certificate seems to be a great way for
authentication, so I am now going to read a lot about OpenSSL and
certificates to see how this technique best fits into my
project! Google will help me find the Tutorials/Code samples I need
(hope so).

I am very grateful for your answer ! Thank you alot !
Jul 17 '05 #7
Philipp Brune <ph***********@t-online.de> wrote:
Yes, I suppose the best solution is to use SSL, why reinvent the wheel ?
Indeed.
I think the client-certificate seems to be a great way for
authentication, so I am now going to read a lot about OpenSSL and
certificates to see how this technique best fits into my
project! Google will help me find the Tutorials/Code samples I need
(hope so).


It does, but I bookmarked this last time I needed to generate a
seflsigned CA and client certificates with openssl (not for/in PHP
though): http://linsec.net/info/ssl-cert.html

Jul 17 '05 #8
In essence, yes. Although you can use the the shared secret to encrypt
a new key each time, which is used to encrypt the actual data.
What I was really asking is whether your system employs passwords.

Jul 17 '05 #9

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

30
by: zn | last post by:
If I place a form for product ordering on my website, what scripting technology or CGIs can I use to encrypt the e-mail sent to my e-mail account with the order information? Thanks.
2
by: Jill Elaine | last post by:
I am building an Access 2002 frontend with linked tables to an encrypted Paradox 7 database. When I first create these linked tables, I'm asked for the password to the encrypted Paradox database,...
2
by: Leonardo D'Ippolito | last post by:
Hi! I have two .NET win apps that need to communicate on a TCP/IP network. 'App A' must ask 'app B' if it's allowed to do some task, and 'app B' must authorize or prohibit it. How can I do...
4
by: Debbie Carter | last post by:
Would anyone know how to read the file attributes of a file on the hard drive to check if the file is encrypted or not? I have searched Visual Studio Help and MSDN and the samples I have found do...
4
by: nepdae | last post by:
Well, after reading and hunting all over the web, including here, I still haven't been successful in my attempts to resolve my situation. So, I thought maybe I'd just ask. Here's the situation: ...
8
by: robert | last post by:
Hello, I want to put (incrementally) changed/new files from a big file tree "directly,compressed and password-only-encrypted" to a remote backup server incrementally via FTP,SFTP or DAV.... At...
5
by: Michael Sperlle | last post by:
Is it possible? Bestcrypt can supposedly be set up on linux, but it seems to need changes to the kernel before it can be installed, and I have no intention of going through whatever hell that would...
3
by: phforum | last post by:
I have no ideas to encrypt the user input password from the text box.....
1
by: vermarajeev | last post by:
Hi guys, I have a plain text file. I want to encrypt and send this file via mail. I use SMTP to send the file over network. I'm able to send the file in plain text but if I encode and send it, I...
3
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 2 August 2023 starting at 18:00 UK time (6PM UTC+1) and finishing at about 19:15 (7.15PM) The start time is equivalent to 19:00 (7PM) in Central...
0
linyimin
by: linyimin | last post by:
Spring Startup Analyzer generates an interactive Spring application startup report that lets you understand what contributes to the application startup time and helps to optimize it. Support for...
0
by: erikbower65 | last post by:
Here's a concise step-by-step guide for manually installing IntelliJ IDEA: 1. Download: Visit the official JetBrains website and download the IntelliJ IDEA Community or Ultimate edition based on...
0
by: kcodez | last post by:
As a H5 game development enthusiast, I recently wrote a very interesting little game - Toy Claw ((http://claw.kjeek.com/))。Here I will summarize and share the development experience here, and hope it...
0
by: Taofi | last post by:
I try to insert a new record but the error message says the number of query names and destination fields are not the same This are my field names ID, Budgeted, Actual, Status and Differences ...
5
by: DJRhino | last post by:
Private Sub CboDrawingID_BeforeUpdate(Cancel As Integer) If = 310029923 Or 310030138 Or 310030152 Or 310030346 Or 310030348 Or _ 310030356 Or 310030359 Or 310030362 Or...
0
by: lllomh | last post by:
Define the method first this.state = { buttonBackgroundColor: 'green', isBlinking: false, // A new status is added to identify whether the button is blinking or not } autoStart=()=>{
0
by: Mushico | last post by:
How to calculate date of retirement from date of birth
2
by: DJRhino | last post by:
Was curious if anyone else was having this same issue or not.... I was just Up/Down graded to windows 11 and now my access combo boxes are not acting right. With win 10 I could start typing...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.