TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN ĐIỆN TỬ VIỄN THÔNG ~~~~~~~~~~~~ BÁO CÁO Thông Tin Di Động Đề tài THỰC HIỆN HỆ THỐNG TRUYỀN TIN BẢO MẬT SỬ DỤNG MÃ HOÁ AES VÀ ĐIỀU CHẾ QPSK Giáo viên hướng dẫn T s.
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN ĐIỆN TỬ- VIỄN THÔNG
~~~~~~*~~~~~~
BÁO CÁO Thông Tin Di Động
Đề tài: THỰC HIỆN HỆ THỐNG TRUYỀN TIN BẢO MẬT SỬ DỤNG MÃ HOÁ AES VÀ ĐIỀU CHẾ QPSK
HÀ NỘI - 2021
Giáo viên hướng dẫn : T.s Nguyễn
Văn Đức
Thành Viên
Hoàng
: 20172578 Phùng Tiến Đạt : 20172456
Vũ Trọng Tùng : 20172902
Trang 2MỤC LỤC
DANH MỤC HÌNH ẢNH
1 ĐIỀU CHẾ VÀ GIẢI ĐIỀU CHẾ QPSK 4
1.1 Điều chế số 4
1.2 Các phương pháp điều chế số thông dụng 4
1.3 Điều chế QPSK 4
1.3.1 Điều chế 4
1.3.2 Bộ dao động 6
1.3.3 Mô phỏng điều chế 7
1.3.4 White noise 8
1.3.5 Giải điều chế 9
1.3.6 Kiểm tra 10
2 HỆ MẬT AES 11
2.1 Mã hóa AES - 128 bit 11
2.1.1 Chức năng AddRoundKey 12
2.1.2 Chức năng SubBytes 13
2.1.3 Chức năng ShiftRows 14
2.1.4 Chức năng MixColumns 15
2.1.5 Chức năng KeyExpansion 16
2.2 Triển khai bằng Python 18
2.2.1 Hàm băm tạo khoá 18
2.2.2 Hàm mã hoá và giải mã hoá 18
2.2.3 Kiểm tra thử bản tin 19
Hình 1 Sơ đồ khối hệ thống mã hoá QPSK 5
Hình 2 Tín hiệu QPSK và biểu đồ vector 5
Hình 3 Kết quả mô phỏng quá trình tạo sóng mang 6
Hình 4 448 bit đầu vào 7
Hình 5 Tín hiệu QPSK đầu ra miền thời gian 8
Hình 6 Tín hiệu sau khi thêm nhiễu 8
Hình 7 Sơ đồ khối mạch giải điều chế QPSK 9
Trang 3Hình 8 Kênh I trước tích phân 9
Hình 9 Mô hình mã hoá và giải mã AES 12
Hình 10 Ví dụ về dữ liệu và mã khoá dưới dạng ma trận 12
Hình 11 Add Roundkey 13
Hình 12 S-Box của AES 13
Hình 13 Ví dụ về Sub - bytes 14
Hình 14 Shift Row 14
Hình 15 Ma trận chuyển đổi sử dụng trong chức năng MixColumns 15
Hình 16 Chức năng MixColumns 15
Hình 17 Chức năng KeyExpansion 16
Hình 18 Thực thi RotWord 16
Hình 19 Thực thi SubWord 17
Hình 20 Giá trị Rcon của các vòng 17
Hình 21 AddRcon 17
Hình 22 Thực thi AddW 18
Trang 41 ĐIỀU CHẾ VÀ GIẢI ĐIỀU CHẾ QPSK
1.1 Điều chế số
Là quá trình 1 trong ba thông số biên độ, tần số và pha của sóng mang được thay đổi theo tín hiệu (hay luồng số) đưa vào điều chế để thông tin của sóng mang phù hợp với đường truyền
1.2 Các phương pháp điều chế số thông dụng
Tùy theo các thông số được sử dụng để mang tin có thể là: biên độ A, tần số f, pha φ hay tổ hợp giữa chúng mà ta có các kiểu điều chế khác nhau: ASK, FSK, PSK, QAM…
Điều chế khoá dịch biên độ ASK (Amplitude Shift Keying): sóng điều biên được tạo ra bằng cách thay đổi biên độ sóng mang theo biên độ tín hiệu băng gốc
Điều chế khoá dịch tần số FSK (Frequency Shift Keying): sóng điều tần được tạo ra bằng cách thay đổi tần số sóng mang theo biên độ tín hiệu băng gốc
Điều chế khoá dịch pha PSK (Phase Shift Keying): sóng điều tần được tạo
ra bằng cách thay đổi pha sóng mang theo biên độ tín hiệu băng gốc
Điều chế vừa kết hợp biên độ và pha hay điều chế cầu phương QAM (Quadrature Amplitude Modulation)
1.3 Điều chế QPSK
QPSK viết tắt của từ Quadature Phase Shift Keying, tiếng Việt gọi là điều chế pha trực giao QPSK là 1 kỹ thuật điều chế tín hiệu số, mã hóa 2 bit thành 1 symbols QPSK (Quadrature phase-shift keying) thỉnh thoảng cũng được gọi là PSK, PSK, 4-QAM QPSK là dùng trục tọa độ cắt vòng tròn ra 4 pha (phases) để chuyển đổi 2 bits thành một symbol
1.3.1 Điều chế
Trong điều chế này, gọi là điều chế góc phần tư (QPSK), sóng mang hình sin lấy 4 giá trị pha cách nhau 90 độ và được xác định bởi tổ hợp 2 bit (Dibit) của tín hiệu
dữ liệu
Trang 5Hình 1 Sơ đồ khối hệ thống mã hoá QPSK
Tín hiệu băng gốc được đưa vào bộ biến nối tiếp thành song song, đầu ra được hai luồng số liệu có tốc độ bit giảm đi một nửa, đồng thời biến đổi tín hiệu đơn cực thành tín hiệu Hai sóng mang đa tới bộ trộn làm lệch nhau 90 độ Tổng hợp hai tín hiệu đầu ra bộ trộn được tín hiệu QPSK
Hình 2 Tín hiệu QPSK và biểu đồ vector
1.3.2 Bộ dao động
Trang 6Ta sử dụng python mô phỏng bộ dao động tạo 2 sóng sin ngược pha nhau với Ts=1, fc
= 1 Với mục đích mô phỏng đồ thị của song sin ở miền thời gian nên ta lấy 100 mẫu trên một đơn vị thời gian (thường là giây)
Kết quả mô phỏng:
Hình 3 Kết quả mô phỏng quá trình tạo sóng mang
1.3.3 Mô phỏng điều chế
Trang 7Đầu tiên ta tách chuỗi bit data thành 2 phần gồm các odd bits (các bit có thứ tự chẵn)
và các even bits (các bit có thứ tự lẻ) sau đó đưa vào tạo xung vuông NRZ (xung có biên độ -1 đến 1) ta được 2 kênh I và Q Sau đó cộng 2 kênh lại ta nhận được tín hiệu QPSK đã được điều chế trên miền thời gian
Mô phỏng bằng python:
Kết quả mô phỏng trên 448 bit đầu vào ta có 224 symbol như sau:
Hình 4 448 bit đầu vào
Trang 8Hình 5 Tín hiệu QPSK đầu ra miền thời gian
1.3.4 White noise
Ta mô phỏng nhiễu Gauss có biên độ nhỏ (từ 0 đến 0.1) và cộng vào tín hiệu QPSK ở đầu ra, ta được kết quả đồ thị thể hiện các pha của tín hiệu trên cùng một khoảng thời gian sau khi có nhiễu:
Hình 6 Tín hiệu sau khi thêm nhiễu
1.3.5 Giải điều chế
Trang 9Hình 7 Sơ đồ khối mạch giải điều chế QPSK
Được thực hiện với 2 mạch tách sóng tích, chúng được hình hành bởi tín hiệu QPSK và hai tín hiệu sóng mang tách biệt có cùng một tần số dùng trong khi truyền và lệch đi 90 °
Đặc trưng chủ yếu của QPSK là :
Áp dụng trong các modem truyền dữ liệu và trong truyền vô tuyến số
Yêu các mạch có độ phức tạp cao
Ít lỗi hơn FSK nhưng nhiều hơn 2.PSK
Hiệu suất truyền bằng 2
Để giải điều chế QPSK ta cần có một bộ dao động giống với bộ điều chế Đầu tiên ta nhân tín hiệu QPSK với 2 tín hiệu hình sin vuông pha nhau tạo bởi bộ dao động, ta tách được tín hiệu QPSK về 2 kênh I và Q
Kết quả mô phỏng sau khi nhân tín hiệu QPSK với tín hiệu từ bộ dao động ta được một trong 2 kênh (kênh I) như sau:
Hình 8 Kênh I trước tích phân
Để đưa tín hiệu về dạng digital ta lấy tích phân của tín hiệu trên miền thời gian, với tích phân có giá trị lớn hơn 0 thì bit được giải điều chế có giá trị là 1 và ngược lại thì bit được giải điều chế có giá trị là 0, tương tự với kênh Q Sau khi gộp 2 chuỗi bit
đã giải điều chế (odd bits và even bits) ta nhận được chuỗi bit ban đầu
Trang 10Mô phỏng bằng python:
1.3.6 Kiểm tra
Sau khi nhận được chuỗi bit sau khi giải điều chế, ta tiến hành kiểm tra tỉ lệ bit
bị truyền lỗi (bit error ratio), với môi trường mô phỏng cho thấy tỉ lệ bit lỗi bằng 0
Kiểm tra bằng python:
2 HỆ MẬT AES
AES là viết tắt của Advanced Encryption Standard, chuẩn mã hóa dữ liệu rất
phổ biến, là một thuật toán mã hóa khối được thiết kế bởi Rijndael, Nó được dùng cho nhiều mục đích và được cả chính phủ Mỹ sử dụng để bảo vệ các dữ liệu tuyệt mật
Trang 11AES là kiểu mã hóa đối xứng dạng khối, nghĩa là mỗi khối văn bản có một kích thước nhất định được mã hóa (dựa vào độ dài khóa), khác với mã hóa dạng chuỗi khi từng kí
tự được mã hóa Đối xứng nghĩa là khóa để mã hóa và giải mã đều là một
AES được xây dựng trên nguyên lý thiết kế lưới giao hoán – thay thế (substitution-permutation network) Đây là một hệ mã có tốc độ tốt trong cả cài đặt phần mềm cũng như phần cứng Khác với DES, AES không theo mẫu thiết kế mạng Feistel Thay vào đó các thao tác cơ bản được thực hiện trên các khối ma trận dữ liệu 4*4 (bytes), được gọi là các trạng thái (state) Số vòng lặp của AES là một tham số xác định trên cơ sở kích thước khóa: 10 vòng lặp cho khóa 128bit, 12 cho 192 bit, 14 cho 256bit
Mã hóa dùng AES gồm nhiều chu trình, các khóa con sử dụng trong các chu trình được tạo ra bởi quá trình tạo khóa con Rijndael Số vòng lặp (kí hiệu là Nr) phụ thuộc vào độ dài khóa :
Nr = 10 nếu khóa dài 128 bit
Nr = 12 nếu khóa có độ dài 192 bit
Nr = 14 nếu độ dài của khóa là 256 bit
2.1 Mã hóa AES - 128 bit
Mã hóa AES được thực hiện thông qua 5 chức năng chính là AddRoundKey, SubBytes, ShiftRows, MixColumns và KeyExpansion Năm chức năng này được
sắp xếp để thực hiện ba bước cơ bản
Bước 1 Bước khởi tạo: dữ liệu cần được mã hóa Plaintext kết hợp
với Key bằng chức năng AddRoundKey
Bước 2 Bước lặp mã hóa: kết quả bước trên được sử dụng để thực hiện tuần tự
các chức năng SubBytes, ShiftRows, MixColumns và AddRoundKey Bước này được lặp lại 9 lần Chú ý, KeyExpansion thực hiện song song với bước AddRoundKey để tạo khóa vòng cho chức năng này.
Bước 3 Bước tạo ngõ ra: Sau 9 lần lặp ở bước 2, kết quả được sử dụng để thực
hiện tuần tự các chức năng SubBytes, ShiftRows và AddRoundKey để tạo
ngõ ra Ciphertext
Trang 12Hình 9 Mô hình mã hoá và giải mã AES
Dữ liệu và khóa mã được sắp xếp dưới dạng ma trận với mỗi phần tử là một byte Trong quá trình mã hóa, ma trận dữ liệu ban đầu sẽ bị biến đổi bởi các chức
năng AddRoundKey, SubBytes, ShiftRows hoặc MixColumns để tạo ra các dữ liệu
trung gian gọi là ma trận trạng thái (State) Ma trận khóa mã sẽ bị biến đổi bởi chức
năng KeyExpansion để tạo ra các khóa mã trung gian gọi là khóa vòng.
Hình 10 Ví dụ về dữ liệu và mã khoá dưới dạng ma trận
2.1.1 Chức năng AddRoundKey
Chức năng AddRoundKey thực hiện ở:
Bước khởi tạo: XOR khóa mã với ma trận dữ liệu
Bước lặp mã hóa và bước tạo ngõ ra: XOR khóa vòng (round key) với ma trận trạng thái
Trang 13Đây là ví dụ về AddRoundKey cho bước khởi tạo Đối với bước lặp mã hóa và bước tạo ngõ ra, vị trí "khóa mã" là các "khóa vòng" còn dữ liệu là của lần tính trước đó
Hình 11 Add Roundkey
2.1.2 Chức năng SubBytes
Chức năng SubBytes là thực hiện thay thế từng byte của ma trận trạng thái, ngõ
ra của AddRoundKey, bằng một giá trị đã quy định trong chuẩn AES Bảng quy định giá trị thay thế gọi là S-box
Hình 12 S-Box của AES
Ví dụ, byte cần thay thế là H08 thì dò ở hàng số 0 và cột số 8 trong bảng S-box
sẽ được kết quả là 30
Trang 14Hình 13 Ví dụ về Sub - bytes
2.1.3 Chức năng ShiftRows
Chức năng ShiftRows thực hiện quay trái từng hàng của ma trận trạng thái, ngõ
ra của SubBytes, theo byte với hệ số quay tăng dần từ 0 đến 3 Hàng đầu tiên có hệ số quay là 0 thì các byte được giữ nguyên vị trí Hàng thứ hai có hệ số quay là 1 thì các byte được quay một byte Hàng thứ ba quay hai byte và hàng thứ tư quay ba byte
Hình 14 Shift Row
2.1.4 Chức năng MixColumns
Chức năng MixColumns thực hiện nhân từng cột của ma trận trạng thái, ngõ ra của ShiftRows, với một ma trận chuyển đổi quy định bởi chuẩn AES Việc biến đổi
Trang 15một cột của ma trận trạng thái được thực hiện bởi hai phép toán là nhân (.) và XOR (+)
Hình 15 Ma trận chuyển đổi sử dụng trong chức năng MixColumns
Hình 16 Chức năng MixColumns
2.1.5 Chức năng KeyExpansion
Chức năng KeyExpansion thực hiện tính toán khóa vòng cho bước lặp mã hóa
và bước tạo ngõ ra Kết quả của một lần thực thi KeyExpansion là một khóa vòng sử
Trang 16dụng cho chức năng AddRoundKey Với mã hóa AES-128, số khóa vòng là 10 tương ứng với 9 lần AddRoundKey ở bước lặp mã hóa và 1 lần AddRoundKey ở bước tạo ngõ ra Chức năng KeyExpansion được thực hiện thông qua 4 chức năng là RotWord, SubWord, AddRcon và AddW
Hình 17 Chức năng KeyExpansion
Mỗi khóa vòng có 128 bit được chia làm 4 word, mỗi word là 4 byte và ký hiệu
là w[j] với j là số nguyên Mã hóa AES-128 có 1 khóa mã và 10 khóa vòng nên tổng
số từ là 44 và được đánh số từ 0 đến 43 Khóa mã có 4 từ là w[0], w[1], w[2] và w[3] Khóa vòng 1 có 4 từ là w[4], w[5], w[6] và w[7] Tương tự, khóa vòng 10 có 4 từ là w[40], w[41], w[42] và w[43]
RotWord: thực hiện quay trái từ w[j] một byte
Hình 18 Thực thi RotWord
SubWord: thực hiện thay thế các phi tuyến từng byte của kết quả RotWord theo bảng S-box
Trang 17Hình 19 Thực thi SubWord
AddRcon: thực hiện XOR kết quả SubWord và giá trị Rcon[j/4] với j là bội số của 4 Số lượng giá trị Rcon[j/4] là 10 tương ứng với 10 lần tính khóa vòng Chức năng AddRcon sẽ tạo ra kết quả cuối cùng của biến đổi trans(w[j-1])
Hình 20 Giá trị Rcon của các vòng
Hình 21 AddRcon
AddWord: Chức năng AddW thực hiện XOR w[j-4] với w[j-1] để tạo ra khóa vòng
Trang 18Hình 22 Thực thi AddW
2.2 Triển khai bằng Python
2.2.1 Hàm băm tạo khoá
#Key is changed able
key = hashlib.sha256(b'16-character key').digest()
Khoá được tạo bằng hàm băm sha.256 tiêu chuẩn Khoá truyền vào là dạng byte 2.2.2 Hàm mã hoá và giải mã hoá
Dùng phương thức pad và unpad để phòng trường hợp dữ liệu mã hoá bị lẻ Thuật toán AES sẽ luôn tạo ra bản mật có số byte chẵn để khi chuyển thành chuỗi bit là chẵn Do QPSK dùng 2 bit làm 1 từ mã nên dòng bit đầu vào phải chẵn
def encrypt(raw):
BS = AES.block_size
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
raw = base64.b64encode(pad(raw).encode('utf8'))
iv = get_random_bytes(AES.block_size)
cipher = AES.new(key= key , mode= AES.MODE_CFB,iv= iv)
return base64.b64encode(iv + cipher.encrypt(raw))
Dùng encode base64 và cả hàm pad, ta sẽ thu được bản mật chẵn IV – Initial Vector được xoay ngẫu nhiên tạo nên hiệu ứng rối của hệ mật
def decrypt(enc):
unpad = lambda s: s[:-ord(s[-1:])]
enc = base64.b64decode(enc)
iv = enc[:AES.block_size]
cipher = AES.new( key , AES.MODE_CFB, iv)
Trang 19return unpad(base64.b64decode(cipher.decrypt(enc[AES.block_size:])).decode('utf 8'))
Khi giải mã thì bản mật được unpad
Hai hàm phụ để chuyển kí tự byte thành bit, đầu vào cho quá trình QPSK
def bytetobit(s):
return ''.join(format(byte, '08b') for byte in cipertext)
def bittobyte(s):
return int(s, 2).to_bytes((len(s) + 7) // 8, byteorder='big')
2.2.3 Kiểm tra thử bản tin