Tuesday, March 8, 2016

JavaScript and JSON

If we have a JSON string like this:

{"result":{"information":[{"name":"Tom","age":25},{"name":"Andy","age":30},{"name":"Peter","age":35},{"name":"David","age":40}]}}

How do we use it in JavaScript?

The answer is very easy. Just use JSON.parse().

JavaScript code:


<script language="JavaScript">
<!--

var JSONStr ='{"result":{"information":[{"name":"Tom","age":25},{"name":"Andy","age":30},{"name":"Peter","age":35},{"name":"David","age":40}]}}';
var JSONObj = JSON.parse(JSONStr);

var count;
for (count = 0 ; count <=3 ; count++){
    document.write("<br><br>");
    document.write(JSONObj.result.information[count].name+" ");
    document.write(JSONObj.result.information[count].age);
}
</script><noscript>
Your browser doesn't support JavaScript.
</noscript>

Result:


Related Information:

Simple JavaScript code - Hello World and Current Time
iOS: Print out JSON content in Swift playground

Simple JavaScript code - Hello World and Current Time

Here is a simple JavaScript code for beginners:

<script language="JavaScript">
<!--
//Hello, World and Random Number
document.write("Hello, JavaScript!");
var myRand = Math.round(Math.random()*100);
var myStr1 = "<br><br>My Random number between 0 and 100:  <b><font size=+2 color=red>"
var myStr2 = "</font></b><br><br>"
document.write(myStr1+myRand+myStr2);

//Date and Time
var month_array = new Array("January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December");
var weekday_array = new Array("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday");

var nowDate = new Date();
var year = nowDate.getFullYear();
var month = nowDate.getMonth();
var day = nowDate.getDate();
var weekday = nowDate.getDay();
var hour = nowDate.getHours();
var ampmStr = hour > 12 ? " PM" : " AM";
hour %= 12;
var minute = nowDate.getMinutes();
var second = nowDate.getSeconds();

//Add 0 if only one digit. See: http://stackoverflow.com/questions/8513032/less-than-10-add-0-to-number
hour = ('0' + hour).slice(-2)
minute = ('0' + minute).slice(-2)
second = ('0' + second).slice(-2)

document.write("Now is:<br>");
document.write(hour+":"+minute+":"+second+ampmStr+"<br>")
document.write(weekday_array[0]+"<br>"+month_array[month]+" "+day+", "+year+"<br><br>")


//Simple Calculation
var a = 3;
var b = 4;
var sum = a+b;
document.write(a+" + "+b+" = "+sum)
</script>
<noscript>
Your browser doesn't support JavaScript.
</noscript>

Result:



Related Information:

JavaScript and JSON

Friday, March 4, 2016

Sending RSA encrypted message - From Python socket server to iOS device (Raspberry Pi Part)

Secure Data Transmission: Raspberry Pi (Python) -> iOS device (Swift)

Secure communication between a mobile device client and a server is important. This tutorial selects an iPhone as the server and uses a Raspberry Pi as the client. The communication procedure is as below:

1. iPhone generates an RSA private / public key pair and sends the public key to server.
2. Server encrypts a message using the public key provided by iPhone and sends the encrypted message to iPhone
3. iPhone decrypts the encrypted message from server using the private key

This tutorial is derived from the basic communication between an iPhone and a Python socket server built on a Raspberry Pi without encryption:

Connect an iPhone to a Simple Python Socket Server (Raspberry Pi Part) (iOS Part)

For an overview on client-server communications, see this:

Communication between iOS device (Client) and Raspberry Pi (Server)

Raspberry Pi Part

Raspberry Pi 2 Model B is used. The Python version used is 2.7.3. Check the Python version with the python -V command.

1. Install Python-Crypto.

sudo apt-get install python-crypto





2. Use sudo nano server.py command to edit a python file as below:


import socket
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5

#Declartion
mysocket = socket.socket()
host = socket.gethostbyname(socket.getfqdn())
port = 7777
publicKeyType_str = "public_key="
message = "Secret message from RPi server"

if host == "127.0.1.1":
    import commands
    host = commands.getoutput("hostname -I")

print "host = " + host

#Prevent socket.error: [Errno 98] Address already in use
mysocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
mysocket.bind((host, port))
mysocket.listen(5)
c, addr = mysocket.accept()

while True:

    #Wait until data is received.
    data = c.recv(1024)
    data = data.replace("\r\n", '') #remove new line character

    if publicKeyType_str in data:

        #remove publicKey_str
        data = data.replace(publicKeyType_str, '')

        #convert string to key
        public_key = RSA.importKey(data)

        #add PKCS1 v1.5 padding
        public_key_padding = PKCS1_v1_5.new(public_key)
        #print(public_key.exportKey()) #Check this with Xcode's debug console.
        print("Client's public key received!")

        #encrypt
        encrypted = public_key_padding.encrypt(message)
        c.send(encrypted)
        print "Encrypted message sent!"

    elif data == "Quit": break

#Server to stop
print "Server stopped"
c.close()

iOS Part

Write an iOS app in Swift. See the client version of this post:

Sending RSA encrypted message - From Python socket server to iOS device (iOS Part)

Result

Run both the socket server on Raspberry Pi and iOS simulator on Mac. Press the four app buttons from top to bottom. Raspberry Pi sends "Secret message from RPi server" to iPhone:


Go back to Communication between iOS device (Client) and Raspberry Pi (Server)

Thursday, March 3, 2016

Sending RSA encrypted message - From iOS device to Python socket server (Raspberry Pi Part)

Secure Data Transmission: iOS device (Swift) -> Raspberry Pi (Python)

Secure communication between a mobile device client and a server is important. This tutorial selects a Raspberry Pi as the server and uses an iPhone simulator as the client. The communication procedure is as below:

1. Server generates an RSA private / public key pair and sends the public key to iPhone
2. iPhone encrypts a message using the public key provided by server and sends the encrypted message to server
3. Server decrypts the encrypted message from iPhone using the private key

This tutorial is derived from the basic communication between an iPhone and a Python socket server built on a Raspberry Pi without encryption:

Connect an iPhone to a Simple Python Socket Server (Raspberry Pi Part) (iOS Part)

For an overview on client-server communications, see this:

Communication between iOS device (Client) and Raspberry Pi (Server)

Raspberry Pi Part

Raspberry Pi 2 Model B is used. The Python version used is 2.7.3. Check the Python version with the python -V command.

1. Install Python-Crypto.

sudo apt-get install python-crypto




2. Use sudo nano server.py command to edit a python file as below:


import socket
from Crypto.PublicKey import RSA
from Crypto import Random

#Generate private key and public key
random_generator = Random.new().read
private_key = RSA.generate(1024, random_generator)
public_key = private_key.publickey()

#Declartion
mysocket = socket.socket()
host = socket.gethostbyname(socket.getfqdn())
port = xxxx

encrypt_str = "encrypted_message="

if host == "127.0.1.1":
    import commands
    host = commands.getoutput("hostname -I")
print "host = " + host

#Prevent socket.error: [Errno 98] Address already in use
mysocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
mysocket.bind((host, port))
mysocket.listen(5)
c, addr = mysocket.accept()

while True:

    #Wait until data is received.
    data = c.recv(1024)
    data = data.replace("\r\n", '') #remove new line character

    if data == "Client: OK":
        c.send("public_key=" + public_key.exportKey() + "\n")
        print "public key sent"

    elif encrypt_str in data:

        #remove encrypt_str
        data = data.replace(encrypt_str, '')

        #decrypt
        decrypted = private_key.decrypt(data)

        #remove padding
        if len(decrypted) > 0 and decrypted[0] == '\x02':
            pos = decrypted.find('\x00')
            if pos > 0:
                c.send("Server: OK")
                message = decrypted[pos+1:]
                print message

    elif data == "Quit": break

#Server to stop
c.send("Server stopped\n")
print "Server stopped"
c.close()


iOS Part

Write an iOS app in Swift. See the client version of this post:

Sending RSA encrypted message - From iOS device to Python socket server (iOS Part)

Result

Run both the socket server on Raspberry Pi and iOS simulator on Mac. Press the four app buttons from top to bottom. iPhone sends "Secret message from iPhone!!" to Raspberry Pi:



Reference:

How to decrypt an RSA encrypted file in Python

Go back to Communication between iOS device (Client) and Raspberry Pi (Server)

Raspberry Pi Setup Procedure

Due to the boot failure of my Raspberry Pi 2 Model B, I tried to make a record of the installation procedure as below:

1. Purchase a Raspberry Pi and Install Raspbian.

2. Configure keyboard as American (US) layout.

3. Connect to Wi-Fi.

4. Update and upgrade with these commands:
sudo apt-get update
sudo apt-get upgrade

5. Configure the time and date.

6. Enable remote access with SSH terminal command if required.

7. Install the VNC server if remote desktop is required. (Useful for screen capture)

8. Install SAMBA server if file exchange is required.

9. Install Apache HTTP server.

10. Install PHP. How to create a PHP file: PHP Basics.

11. Install MySQL database server.

Note: Linux + Apache + MySQL + PHP is known as LAMP.

12. Install the Vim text editor if required.

13. Install FTP server if required.

14. Install more servers if required.

=======
Chinese version of this post (含中文字型安裝)

Getting Started with Raspberry Pi

This post is for people who just bought a Raspberry Pi.

Requirements

- You need to purchase a Raspberry Pi first.

- You may also need:

PRi case

Power supply with Micro USB connector

Micro SD card

(At least one SD adapter is required to be inserted into a computer.)
(If you want to switch between different operating systems,
you may buy 2 or more microSD cards.)

An HDMI-to-DVI cable
(The monitor needs to have a DVI-D input connector.)

Wi-Fi USB dongle (for Raspberry Pi 2 Model B)
(Raspberry Pi 3 includes built-in Wi-Fi function and hence doesn't need it.)

My Wi-Fi USB dongle is EDUP EP-N8508GS
You may choose any one of compatible USB Wi-Fi adapters.


Put the Raspberry Pi in a case.



If you connect the RPi to a monitor and a power supply now, nothing will happen.
This is because the microSD card is required.

A newly purchased microSD card should have already been formatted.
Go to the official Raspberry Pi website and download the NOOBS installer.
Unzip the file to the SD memory card, which is then insert into the RPi.
Connect RPi with a mouse and a keyboard, then start booting!

If you are using a Mac to copy NOOBS and unable to write to the memory card
because it is 'read-only',
try adjust the switch of the adapter to the middle as this video:
I tried it once. It did work!

Connect RPi to power.
Select the first option Raspbian, which is the official operating system

Installing...




Remember the default username is pi, and the password is raspberry.

If you don't want to change any settings, select Finish.






If the window/graphical interface is not displayed, type the startx command.

Connect the RPi to a network cable, and you should be able to surf the internet with the Epiphany web browser!!

========

Default Login ID and password:
raspberrypi login: pi
Password: raspberry

Basic commands:

Start the graphical user interface (X Window)
startx

Run commands as the superuser:

sudo

Show directories and files at the current path:
ls

Show the current path:
pwd

Show network information such as IP address:
ifconfig
hostname -I

Show the remaining space of the microSD card:
df -h /dev/root

Show the Linux kernel version:
uname -a

Clear the screen:
clear

Shut down the RPi:
sudo halt

Reboot the RPi:
sudo reboot

Create a folder:
mkdir folder_name

Enter a folder:
cd folder_name

Exit a folder:
cd ..

Return to the home directory of user pi:
cd


Commands to update and upgrade RPi:

sudo apt-get update

sudo apt-get upgrade


A good function with the Tab key:

While typing commands, hit the tab key to autocomplete the name of a file/folder.

For example, type cd De. Then hit the tab key, the command line becomes:
cd Desktop/

=====
Go back to Raspberry Pi Setup Procedure.
Getting Started 與樹莓派的初次接觸 (Chinese version of this post.)

Wednesday, February 24, 2016

Using OpenSSL to decrypt an encrypted message exported by Python

This tutorial involves three parts:

(1) OpenSSL: Generate a private and public key pair using. 
(2) Python: Use the public key to export an encrypted message.
(3) OpenSSL: Decrypt the message using the private key.

(1) OpenSSL

Generate an RSA private and public key pair in PEM format.

1. Generate a 1024-bit private key:

sudo openssl genrsa -out private_key.pem 1024

2. Obtain a public key from the private key:

sudo openssl rsa -in private_key.pem -pubout -out public_key.pem

(2) Python

1. Edit a Python file called encrypt.py as:


from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5

f = open("public_key.pem","r")
public_key = RSA.importKey(f.read())
f.close()

# Generate a cypher using the PKCS1 v1.5 standard.
# See: GitHub: EncryptionExample/python/encrypt.py
cipher = PKCS1_v1_5.new(public_key)

message = "Secret message in Python file"

encrypted = cipher.encrypt(message)

f = open("encrypted.txt","w")
f.write(encrypted)
f.close()

print "OK"

2. Produce the  file with this command:

sudo python encrypt.py

(3) OpenSSL



Decrypt encrypted.txt with private_key.pem using this command:


openssl rsautl -in encrypted.txt -decrypt -inkey private_key.pem

Note


PKCS#1 v1.5 padding is required in encrypt.py. Without it, this error may happen with the OpenSSL decryption command:


RSA operation error

rsa routines:RSA_EAY_PRIVATE_DECRYPT:data greater than mod len:rsa_eay.c:523:

References:

Encrypt/decrypt a string with code-generated RSA public/private keys in Python
Encrypt/decrypt a string with RSA public/private PEM files using Python
OpenSSL RSA commands to encrypt/decrypt a message in terminal

Friday, February 19, 2016

Read/Write a file in Python

The Python code below shows how to write a string to a storage file and then print the file content by reading:


open("storage.txt","w").write("Hello, World!")

readStr = open("storage.txt","r").read()

print readStr

iOS version:

Read/Write a file in an iOS app (Swift 2)

Thursday, February 18, 2016

OpenSSL RSA commands to encrypt/decrypt a message in terminal

It is possible to use OpenSSL commands to:

(1) generate an RSA private/public key pair.
(2) encrypt and decrypt a message using the private/public keys generated.

Some explanations:
(1) Generate an RSA private key first. The public key can then be obtained from the private key.
(2) Use different keys of the same key pair for encrypting/decrypting. For example, encrypt a message with the public key and then decrypt the encrypted message with the private A cryptosystem using this public-private key mechanism is known as asymmetric because different keys are used for encrypting/decrypting.

The following terminal commands have been tested on a Raspberry Pi and a Mac.

For Raspberry Pi, commands may need an extra sudo word in front of openssl or executed in the desktop folder.

1. Generate an RSA private and public key pair in PEM format:

Generate a 1024-bit private key:

openssl genrsa -out private_key.pem 1024

Obtain a public key from the private key:

openssl rsa -in private_key.pem -pubout -out public_key.pem



2. Create a message.txt file and edit its content:

sudo nano message.txt



3. Encrypt message.txt with public_key.pem using this command:

openssl rsautl -in message.txt -encrypt -pubin -inkey public_key.pem > encrypted.txt



4. Decrypt encrypted.txt with private_key.pem using this command:


Tuesday, January 19, 2016

Sending an RSA encrypted message from client to Python socket server


The example below shows how to send an RSA encrypted message from a client to a Python socket server.

A Mac is used as the client, while a Raspberry Pi is used as the server. For the introduction to the Python socket server, refer to this:
Connect Mac / iPhone to a Simple Python Socket Server

Connection procedure of this example
1. Private and public keys generated in server.
2. Server enabled to listen to client.
3. Client sends "Client: OK" to server.
4. Server sends public key to client.
5. Client uses the public key to encrypt a message, which is then sent to server. 
6. Server decrypts the message and informs client "Server: OK".
7. Client tells the server to "Quit".
8. Both server and client are stopped.

Configurations for the server and client are as below:

Server (Raspberry Pi)

1. Install Python-Crypto.

sudo apt-get install python-crypto




2. Use sudo nano server_rsa.py command to edit a python file as below:

import socket
from Crypto.PublicKey import RSA
from Crypto import Random

#Generate private and public keys
random_generator = Random.new().read
private_key = RSA.generate(1024, random_generator)
public_key = private_key.publickey()

#Declartion
mysocket = socket.socket()
host = socket.gethostbyname(socket.getfqdn())
port = 7777
encrypt_str = "encrypted_message="

if host == "127.0.1.1":
    import commands
    host = commands.getoutput("hostname -I")
print "host = " + host

#Prevent socket.error: [Errno 98] Address already in use
mysocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

mysocket.bind((host, port))

mysocket.listen(5)

c, addr = mysocket.accept()

while True:

    #Wait until data is received.
    data = c.recv(1024)
    data = data.replace("\r\n", '') #remove new line character

    if data == "Client: OK":
        c.send("public_key=" + public_key.exportKey() + "\n")
        print "Public key sent to client."

    elif encrypt_str in data: #Reveive encrypted message and decrypt it.
        data = data.replace(encrypt_str, '')
        print "Received:\nEncrypted message = "+str(data)
        encrypted = eval(data)
        decrypted = private_key.decrypt(encrypted)
        c.send("Server: OK")
        print "Decrypted message = " + decrypted

    elif data == "Quit": break

#Server to stop
c.send("Server stopped\n")
print "Server stopped"
c.close()

Client (Mac)

1. Install Python-Crypto.

sudo easy_install pycrypto

2. Use sudo nano client_rsa.py command to edit a python file as below:

import socket
from Crypto.PublicKey import RSA

server = socket.socket()
host = "192.168.xx.xx"
port = 7777

server.connect((host, port))

#Tell server that connection is OK
server.sendall("Client: OK")

#Receive public key string from server
server_string = server.recv(1024)

#Remove extra characters
server_string = server_string.replace("public_key=", '')
server_string = server_string.replace("\r\n", '')

#Convert string to key
server_public_key = RSA.importKey(server_string)

#Encrypt message and send to server
message = "This is my secret message."
encrypted = server_public_key.encrypt(message, 32)
server.sendall("encrypted_message="+str(encrypted))

#Server's response
server_response = server.recv(1024)
server_response = server_response.replace("\r\n", '')
if server_response == "Server: OK":
    print "Server decrypted message successfully"

#Tell server to finish connection
server.sendall("Quit")
print(server.recv(1024)) #Quit server response
server.close()

Result

1. Type this command at the server:

python server_rsa.py

2. Type this command at the client:

python client_rsa.py

3. Result at the server:

host = 192.168.xx.xx 
Public key sent to client.
Received:
Encrypted message = ('\x9a\xe0\x08\xa1\xb6\x86?\xc7\xde\xb6\xa0\xbe\xa7!\xecem.\xb1R\xc5h\x19cv]{\xd3\x04\xcf\x0e\xf0\xfe\xc50\x1e\xc9U\xff\xd5\xf2\xb1,EQ\xdf2\x89![\xb7s\x84:C\xbdg\xbf$\x05\'\xb8@GK\x18Q\xd5N\xe9\x13\x12e\x8c\xe7F\xc8+\x95\xcdj\xb6\xcc9\xc8-t\x17-\xb8\xdei\x8f\x90\xdd\xcf\xd9@\xa0\xf8\xe8\xe5\xcci\xea"M\x82\xb8%\xf7\xfccc G{\x16A)\xf2\xcb"\x15\xa8\x16\xd3M',)
Decrypted message = This is my secret message.
Server stopped

4. Result at the client:

Server decrypted message successfully
Server stopped


References:

Connect Mac / iPhone to a Simple Python Socket Server
Encrypt / decrypt a string with RSA public / private keys in PHP
Encrypt / decrypt a string with RSA public / private PEM files using Python
Encrypt / decrypt a string with code-generated RSA public / private keys in Python

iOS:
Encrypt / decrypt a string with RSA public / private keys in Swift