- vừa được xem lúc

Một số thuật toán cơ bản được ứng dụng trong an toàn thông tin (Phần 2)

0 0 51

Người đăng: Magic Stick

Theo Viblo Asia

Phần 1: https://viblo.asia/p/mot-so-thuat-toan-co-ban-duoc-ung-dung-trong-an-toan-thong-tin-phan-1-Ljy5VvRk5ra

a. Thuật toán cộng chính xác bội

  • Thuật toán cộng và trừ trên trường hữu hạn được đưa ra dưới dạng các thuật toán tương ứng cho các số nguyên w. Phép gán dạng "(ɛ, z) ← w" được định nghĩa như sau:
  1. z ← W mod 2W2^{W} và ε ← 0 nếu w ∈ [0, 2W2^{W}), ngược lại ε ← 1.
  2. Nếu w = x + y + ε' với x, y ∈ [0, 2W2^{W}) và ε ∈ {0, 1} , thì w = ε 2W2^{W} + z và ε được gọi là “bit nhớ” (carry bit) cho phép cộng mỗi một từ đơn (ε = 1 nếu và chỉ nếu z < x + ε' )

VD: Cho a = (0, 11, 173, 248); b = (0, 1, 226, 64), với w = 8, t = 4. Tìm c = a + b mod 2Wt2^{Wt}

a = [0, 11, 173, 248]
b = [0, 1, 226, 64]
W = 8
t = 4 def solve(a, b, W, t): a.reverse() b.reverse() c = [] epsilon = 0 e = pow(2, 8) for i in range(t): s = a[i] + b[i] + epsilon x = s%e if(s > e): epsilon = 1 else: epsilon = 0 c.append(x) return [epsilon, c[::-1]] if __name__ == '__main__': print(solve(a, b, W, t))

b. Thuật toán trừ chính xác bội

VD: Cho a = (0, 11, 173, 248); b = (0, 1, 226, 64), với w = 8, t = 4. tìm c = a - b mod 2Wt2^{Wt}

a = [0, 11, 173, 248]
b = [0, 1, 226, 64]
W = 8
t = 4 def solve(a, b, W, t): a.reverse() b.reverse() c = [] epsilon = 0 e = pow(2, 8) for i in range(t): d = a[i] - b[i] - epsilon if(d < 0): d += e epsilon = 1 else: epsilon = 0 x = d%e c.append(x) return epsilon, c[::-1] if __name__ == '__main__': print(solve(a, b, W, t))

c. Thuật toán cộng trên FpF_{p}

Cho p = 2.147.483.647, W = 8; ta có m = [log2(p)][\log_{2}(p)] = 31; t = [m/W] = 4. a = (0, 11, 173, 248); b = (0, 1, 226, 64). 3 Tìm c = a + b mod p

import math, re p = 2147483647
a = [157, 0, 173, 23]
b = [169, 1, 0, 64]
W = 8
m = round(math.log2(p))
t = round(m/W) def int_to_dec(n): n = bin(n)[2:].zfill(8*t) b = re.findall('\d{8}', n) c = ['0b' + i for i in b] return [int(i, 2) for i in c] def dec_to_int(n): n = ''.join([bin(i)[2:].zfill(8) for i in n]) return int(n, 2) def multiprecision_addition(a, b, W, t): a.reverse() b.reverse() c = [] epsilon = 0 e = pow(2, 8) for i in range(t): s = a[i] + b[i] + epsilon x = s%e if(s > e): epsilon = 1 else: epsilon = 0 c.append(x) return [epsilon, c[::-1]] def multiprecision_subtraction(a, b, W, t): a.reverse() b.reverse() c = [] epsilon = 0 e = pow(2, 8) for i in range(t): d = a[i] - b[i] - epsilon if(d < 0): d += e epsilon = 1 else: epsilon = 0 x = d%e c.append(x) return epsilon, c[::-1] if __name__ == '__main__': [epsilon, c] = multiprecision_addition(a, b, W, t) p = int_to_dec(p) if epsilon == 1: d = multiprecision_subtraction(c, p, W, t) elif epsilon == 0: d = multiprecision_subtraction(p, c, W, t) print(d) 

d. Thuật toán trừ trên FpF_{p}

Cho p = 2.147.483.647, W = 8; ta có m = [log2(p)][\log_{2}(p)] = 31; t = [m/W] = 4. a = (0, 11, 173, 248); b = (0, 1, 226, 64). 3 Tìm c = a - b mod p

import math, re p = 2147483647
a = [0, 11, 173, 248]
b = [0, 1, 226, 64]
W = 8
m = round(math.log2(p))
t = round(m/W) def int_to_dec(n): n = bin(n)[2:].zfill(8*t) b = re.findall('\d{8}', n) c = ['0b' + i for i in b] return [int(i, 2) for i in c] def dec_to_int(n): n = ''.join([bin(i)[2:].zfill(8) for i in n]) return int(n, 2) def multiprecision_addition(a, b, W, t): a.reverse() b.reverse() c = [] epsilon = 0 e = pow(2, 8) for i in range(t): s = a[i] + b[i] + epsilon x = s%e if(s > e): epsilon = 1 else: epsilon = 0 c.append(x) return [epsilon, c[::-1]] def multiprecision_subtraction(a, b, W, t): a.reverse() b.reverse() c = [] epsilon = 0 e = pow(2, 8) for i in range(t): d = a[i] - b[i] - epsilon if(d < 0): d += e epsilon = 1 else: epsilon = 0 x = d%e c.append(x) return epsilon, c[::-1] if __name__ == '__main__': [epsilon, c] = multiprecision_subtraction(a, b, W, t) p = int_to_dec(p) if epsilon == 1: d = multiprecision_addition(c, p, W, t) elif epsilon == 0: d = c print(d) 

Còn tiếp...

Bình luận

Bài viết tương tự

- vừa được xem lúc

Thuật toán quay lui (Backtracking)

Quay lui là một kĩ thuật thiết kế giải thuật dựa trên đệ quy. Ý tưởng của quay lui là tìm lời giải từng bước, mỗi bước chọn một trong số các lựa chọn khả dĩ và đệ quy.

0 0 38

- vừa được xem lúc

Các thuật toán cơ bản trong AI - Phân biệt Best First Search và Uniform Cost Search (UCS)

Nếu bạn từng đọc các thuật toán trong AI (Artificial Intelligence - Trí tuệ nhân tạo), rất có thể bạn từng nghe qua về các thuật toán tìm kiếm cơ bản: UCS (thuộc chiến lược tìm kiếm mù) và Best First Search (thuộc chiến lược tìm kiếm kinh nghiệm). Khác nhau rõ từ khâu phân loại rồi, thế nhưng hai th

0 0 152

- vừa được xem lúc

Sử dụng vector trong lập trình C++ - giải bài toán lập trình muôn thủa

Chào buổi tối mọi người, hôm nay lang thang trên mạng bắt gặp bài toán quen thuộc một thời của quãng đường sinh viên IT. Đấy chính là câu số 1 trong đề thi dưới đây:.

0 0 35

- vừa được xem lúc

MÔ PHỎNG THUẬT TOÁN VƯƠNG HẠO TRONG PROLOG

. 1. Các luật suy diễn trong thuật toán Vương Hạo. Luật 1: Chuyển vế các giả thuyết và kết luận ở dạng phủ định. Ví dụ: p v q, !(r ^ s), !q, p v r -> s, !p <=> p v q, p v r, p -> s, r ^ s, q.

0 0 76

- vừa được xem lúc

A* Search Algorithm

What is A* Search Algorithm. How it works. . Explanation.

0 0 42

- vừa được xem lúc

Python: Jump Search

Search là một từ khóa khá là quen thuộc đối với chúng ta. Hiểu theo đúng nghĩa đen của nó chính là "Tìm kiếm".

0 0 35