Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
C
comp30023-2019-project-2
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Xun Zhang
comp30023-2019-project-2
Commits
2414a947
Commit
2414a947
authored
6 years ago
by
ChouTatsumi
Browse files
Options
Downloads
Patches
Plain Diff
complete dh.c
parent
a7f9f140
No related branches found
No related tags found
No related merge requests found
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
.gitignore
+2
-1
2 additions, 1 deletion
.gitignore
README.md
+8
-1
8 additions, 1 deletion
README.md
dh.c
+172
-2
172 additions, 2 deletions
dh.c
doc/client.c
+96
-0
96 additions, 0 deletions
doc/client.c
with
278 additions
and
4 deletions
.gitignore
+
2
−
1
View file @
2414a947
**/.vscode
**/.vscode
**/test.*
\ No newline at end of file
This diff is collapsed.
Click to expand it.
README.md
+
8
−
1
View file @
2414a947
# COMP30023 2019 Project 2
# COMP30023 2019 Project 2
## Reference
## Reference
part [scp on Linux] from lab 9
1.
Modular Exponentiation algorithm
https://en.wikipedia.org/wiki/Modular_exponentiation
2.
'client.c'
from lab 5
3.
scp on Linux
from lab 9
## Acknowledgement
## Acknowledgement
This project completed by Xun Zhang (854776)
This project completed by Xun Zhang (854776)
\ No newline at end of file
This diff is collapsed.
Click to expand it.
dh.c
+
172
−
2
View file @
2414a947
// Header files
// Header files
#include
<stdio.h>
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#include
<netdb.h>
#include
<netinet/in.h>
#include
<strings.h>
#include
<sys/socket.h>
#include
<sys/types.h>
#include
<unistd.h>
// constants
// constants
#define HOSTNAME "172.26.37.44"
#define PORT 7800
#define COMMAND "openssl sha256 dh.c"
#define RESULT_TITLE "SHA256(dh.c)= "
#define RESULT_TITLE_LEN 14
#define BUFFERSIZE 256
#define MESSAGE_ENDING '\n'
#define USERNAME "xunz4"
#define g_Value 15
#define p_Value 97
// methods reference
// methods reference
int
get_b_Value
(
char
*
hashresult
);
int
calculate
(
int
base
,
int
pow
,
int
modulus
);
int
main
(
int
argc
,
char
**
argv
)
{
int
main
(
int
argc
,
char
**
argv
)
{
// used to save message
char
buffer
[
BUFFERSIZE
];
int
b_Value
;
// get b value
FILE
*
fp
;
fp
=
popen
(
COMMAND
,
"r"
);
memset
(
buffer
,
'\0'
,
BUFFERSIZE
);
if
(
fgets
(
buffer
,
sizeof
(
buffer
),
fp
)
!=
NULL
&&
strstr
(
buffer
,
RESULT_TITLE
)
!=
NULL
)
{
char
*
hashresult
=
strstr
(
buffer
,
RESULT_TITLE
)
+
RESULT_TITLE_LEN
;
bValue
=
get_b_Value
(
hashresult
);
}
// connect to server
int
sockfd
;
struct
sockaddr_in
serv_addr
;
struct
hostent
*
server
;
// build server
server
=
gethostbyname
(
HOSTNAME
);
if
(
server
==
NULL
)
{
fprintf
(
stderr
,
"ERROR, no such host
\n
"
);
exit
(
0
);
}
// Building data structures for socket
memset
((
char
*
)
&
serv_addr
,
'\0'
,
sizeof
(
serv_addr
));
serv_addr
.
sin_family
=
AF_INET
;
bcopy
(
server
->
h_addr_list
[
0
],
(
char
*
)
&
serv_addr
.
sin_addr
.
s_addr
,
server
->
h_length
);
serv_addr
.
sin_port
=
htons
(
PORT
);
/* Create TCP socket -- active open
* Preliminary steps: Setup: creation of active open socket
*/
sockfd
=
socket
(
AF_INET
,
SOCK_STREAM
,
0
);
if
(
sockfd
<
0
)
{
perror
(
"ERROR opening socket"
);
exit
(
0
);
}
if
(
connect
(
sockfd
,
(
struct
sockaddr
*
)
&
serv_addr
,
sizeof
(
serv_addr
))
<
0
)
{
perror
(
"ERROR connecting"
);
exit
(
0
);
}
// Do processing
// send username
memset
(
buffer
,
'\0'
,
BUFFERSIZE
);
strcpy
(
buffer
,
USERNAME
);
buffer
[
strlen
(
buffer
)]
=
MESSAGE_ENDING
;
n
=
write
(
sockfd
,
buffer
,
strlen
(
buffer
));
if
(
n
<
0
)
{
perror
(
"ERROR writing to socket"
);
exit
(
0
);
}
// send g^b (mod p)
memset
(
buffer
,
'\0'
,
BUFFERSIZE
);
int
B
=
calculate
(
g_Value
,
b_Value
,
p_Value
);
sprintf
(
buffer
,
"%d"
,
B
);
buffer
[
strlen
(
buffer
)]
=
MESSAGE_ENDING
;
n
=
write
(
sockfd
,
buffer
,
strlen
(
buffer
));
if
(
n
<
0
)
{
perror
(
"ERROR writing to socket"
);
exit
(
0
);
}
// receive g^a (mod p)
memset
(
buffer
,
'\0'
,
BUFFERSIZE
);
n
=
read
(
sockfd
,
buffer
,
BUFFERSIZE
-
1
);
if
(
n
<
0
)
{
perror
(
"ERROR reading from socket"
);
exit
(
0
);
}
int
A
=
atoi
(
buffer
);
// send key A^b (mod p)
memset
(
buffer
,
'\0'
,
BUFFERSIZE
);
int
keyB
=
calculate
(
A
,
b_Value
,
p_Value
);
sprintf
(
buffer
,
"%d"
,
keyB
);
buffer
[
strlen
(
buffer
)]
=
MESSAGE_ENDING
;
n
=
write
(
sockfd
,
buffer
,
strlen
(
buffer
));
if
(
n
<
0
)
{
perror
(
"ERROR writing to socket"
);
exit
(
0
);
}
// receive status report
memset
(
buffer
,
'\0'
,
BUFFERSIZE
);
n
=
read
(
sockfd
,
buffer
,
BUFFERSIZE
-
1
);
if
(
n
<
0
)
{
perror
(
"ERROR reading from socket"
);
exit
(
0
);
}
return
0
;
}
/* get the hashresult string and convert the rst two hexadecimal digits to an
* integer
*/
int
get_b_Value
(
char
*
hashresult
)
{
char
substring
[
3
];
memset
(
substring
,
'\0'
,
sizeof
(
substring
));
strncpy
(
substring
,
hashresult
,
2
);
int
hex
;
sscanf
(
substring
,
"%x"
,
&
hex
);
return
hex
;
}
/* Since the limit of int, we have to use supplement function which applying
* Modular Exponentiation algorithm for the calculation of g^b (modp)
*/
int
calculate
(
int
base
,
int
pow
,
int
modulus
)
{
int
odd
;
int
output
=
1
;
while
(
pow
>
0
)
{
odd
=
pow
%
2
;
if
(
odd
)
output
=
(
output
*
base
)
%
modulus
;
base
=
base
*
base
%
modulus
;
pow
=
pow
/
2
;
}
return
output
;
}
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
doc/client.c
0 → 100644
+
96
−
0
View file @
2414a947
/* A simple client program for server.c
To compile: gcc client.c -o client
To run: start the server, then the client */
#include
<netdb.h>
#include
<netinet/in.h>
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#include
<strings.h>
#include
<sys/socket.h>
#include
<sys/types.h>
#include
<unistd.h>
int
main
(
int
argc
,
char
**
argv
)
{
int
sockfd
,
portno
,
n
;
struct
sockaddr_in
serv_addr
;
struct
hostent
*
server
;
char
buffer
[
256
];
if
(
argc
<
3
)
{
fprintf
(
stderr
,
"usage %s hostname port
\n
"
,
argv
[
0
]);
exit
(
0
);
}
portno
=
atoi
(
argv
[
2
]);
/* Translate host name into peer's IP address ;
* This is name translation service by the operating system
*/
server
=
gethostbyname
(
argv
[
1
]);
if
(
server
==
NULL
)
{
fprintf
(
stderr
,
"ERROR, no such host
\n
"
);
exit
(
0
);
}
/* Building data structures for socket */
bzero
((
char
*
)
&
serv_addr
,
sizeof
(
serv_addr
));
serv_addr
.
sin_family
=
AF_INET
;
bcopy
(
server
->
h_addr_list
[
0
],
(
char
*
)
&
serv_addr
.
sin_addr
.
s_addr
,
server
->
h_length
);
serv_addr
.
sin_port
=
htons
(
portno
);
/* Create TCP socket -- active open
* Preliminary steps: Setup: creation of active open socket
*/
sockfd
=
socket
(
AF_INET
,
SOCK_STREAM
,
0
);
if
(
sockfd
<
0
)
{
perror
(
"ERROR opening socket"
);
exit
(
0
);
}
if
(
connect
(
sockfd
,
(
struct
sockaddr
*
)
&
serv_addr
,
sizeof
(
serv_addr
))
<
0
)
{
perror
(
"ERROR connecting"
);
exit
(
0
);
}
/* Do processing
*/
printf
(
"Please enter the message: "
);
bzero
(
buffer
,
256
);
fgets
(
buffer
,
255
,
stdin
);
n
=
write
(
sockfd
,
buffer
,
strlen
(
buffer
));
if
(
n
<
0
)
{
perror
(
"ERROR writing to socket"
);
exit
(
0
);
}
bzero
(
buffer
,
256
);
n
=
read
(
sockfd
,
buffer
,
255
);
if
(
n
<
0
)
{
perror
(
"ERROR reading from socket"
);
exit
(
0
);
}
printf
(
"%s
\n
"
,
buffer
);
return
0
;
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment