2010-10-27 39 views
10

Tôi cần một số gợi ý hoặc một ví dụ thực tế về cách mã hóa một int đến một int khác, và một khóa bí mật sẽ được yêu cầu để giải mã giá trị.Số nguyên đối xứng để mã hóa số nguyên

Cái gì như:

encrypt(1, "secret key") == 67123571122 
decrypt(67123571122, "secret key") == 1 

anh chàng này yêu cầu khá nhiều câu hỏi tương tự: Symmetric Bijective Algorithm for Integers
tuy nhiên tôi trở thành một tổng mã hóa "n00b" Tôi muốn một số ví dụ thực tế hơn, trong python nếu có thể.

Tôi hiểu rằng tôi cần phải sử dụng một số loại mã khối, nhưng tôi khá mất trên một phần về việc giữ gìn kết quả mã hóa vẫn có dạng số và hơi ngắn (có thể là một dài thay vì một int)

Bất kỳ con trỏ? Cảm ơn

CẬP NHẬT- Tại sao tôi muốn thực hiện việc này?
Tôi có một dịch vụ web, nơi từng "đối tượng" được một URL, ví dụ .: example.com/thing/123456/

Ngay bây giờ, những ID là tuần tự. Tôi muốn che giấu thực tế rằng chúng là tuần tự (ID cơ sở dữ liệu).

Nội dung trên các trang đó không phải là "bí mật hàng đầu" hoặc bất kỳ thứ gì giống như vậy, nhưng không dễ để ai đó lẻn vào một số đối tượng ngẫu nhiên khác như chỉ tăng ID đó trong URL.

Vì vậy, với một số loại mã hóa số hai chiều, ID URL sẽ không được tuần tự chút nào và sẽ mất một chút thời gian để tìm thêm các đối tượng này. (Ngoài ra, các yêu cầu được điều chỉnh)

Và lý do duy nhất tôi muốn giữ số này thay vì chuỗi tùy ý là thay đổi là tổng thay thế và mọi thứ sẽ hoạt động mà không cần bất kỳ thay đổi mã nào khác.

Ngoài ra, tôi không thể tạo ID cơ sở dữ liệu ngẫu nhiên mới. Tôi phải xử lý mã hóa/giải mã này trong ứng dụng.

+2

Tại sao bạn làm điều này? Mục tiêu là gì? Rất nguy hiểm khi tạo mật mã của riêng bạn. Ngay cả những thứ đơn giản như “chỉ sử dụng thuật toán mã hóa X” cũng có thể có các nhánh bảo mật bất ngờ. –

+0

Điểm tốt. Tôi đã cập nhật câu hỏi – adamJLev

+0

[Định dạng mã hóa bảo quản] (http://en.wikipedia.org/wiki/Format-preserving_encryption) –

Trả lời

3

Tùy thuộc vào cách bảo mật mật mã bạn muốn. Đối với không-rất an toàn (trong ý nghĩa mã hóa - có lẽ tốt cho sử dụng hàng ngày nếu bạn không thực sự mong đợi tấn công nghiêm trọng) sau đó XOR với một khóa bí mật cố định sẽ làm việc. Chỉ cần lưu ý rằng nó sẽ dễ bị tổn thương đối với một số giải mã khá cơ bản.

Nếu bạn muốn mã hóa thực, có thể bạn sẽ phải sử dụng mật mã dòng như RC4. Bạn có thể lấy 32 bit của keystream và XOR nó với giá trị của bạn để mã hóa nó. Miễn là bạn nhận được một 32 bit mới của keystream cho mỗi giá trị bạn sẽ được sử dụng tốt.

RC4 có một số cảnh báo, tuy nhiên, vì vậy hãy đọc kỹ trước.

Mật mã khối sẽ không phải là bạn của bạn trong trường hợp này vì tất cả chúng đều có kích thước khối từ 64 bit trở lên. Điều này có nghĩa là bạn cần phải pad số nguyên 32 bit của bạn đến 64 bit và bạn sẽ nhận được 64 bit trở lại ... nhưng bạn không thể chọn 32 để giữ. Bạn sẽ không thể giải mã nó chỉ bằng một nửa số bit. Nếu bạn đang hạnh phúc để di chuyển đến longs sau đó bạn có thể sử dụng 3DES hoặc Blowfish.

Tất cả phụ thuộc vào chính xác những gì bạn đang mã hóa và tại sao, do đó, thật khó để đưa ra câu trả lời dứt khoát. Tôi hy vọng điều này cho một ý tưởng về nơi để bắt đầu, ít nhất.

+1

+1 đối với mật mã khối 64 bit. Tôi có một ví dụ về điều này ở đây: http://stackoverflow.com/questions/3569783/query-string-parameter-obfuscation/3571165#3571165 Ngoài ra một số nguyên 64 bit được biểu diễn dưới dạng hex chỉ dài 16 ký tự và chỉ nên sử dụng tốt để sử dụng trong URL. –

0

Bạn muốn mã hóa chỉ một 'int' tức là số q 32/64 bit?
Sau đó, cách dễ nhất là chỉ XOR bằng khóa bí mật 32/64bit.

+0

Cách khác, XOR bằng một khóa nhỏ hơn, lặp lại trong khoảng thời gian của số. –

+0

Mã sẽ trông như thế nào, nhiều hơn hoặc ít hơn? – adamJLev

+0

hãy cẩn thận với xor thẳng vì sau đó chỉ với 64 ví dụ có cơ hội người dùng có thể tìm ra khóa. –

1

Bạn có thể xem bài báo này: Perfect Block Ciphers with Small Blocksthe slides của bản trình bày tại hội thảo FSE 2007.

Bài báo giải thích cách chọn ngẫu nhiên hoán vị của các phần tử n (ví dụ: số nguyên giữa 0 và n-1) có thể được xem dưới dạng mật mã cho tập hợp các phần tử n này.

1

Câu trả lời tôi đăng cho câu hỏi đó cũng áp dụng cho câu hỏi của bạn: sử dụng mật mã khối ngắn. Giả sử số nhận dạng của bạn là 64 bit, trên thực tế, bạn có thể chỉ cần sử dụng mật mã XTEA như là, với số nguyên 64 bit làm khối dữ liệu.

+0

Điều đó nghe có vẻ đủ tốt, và mã cho XTEA trông đơn giản, đủ để dễ dàng chuyển sang python. Thx tôi sẽ cho một shot – adamJLev

0

XOR đơn giản không thể được gọi là mã hóa. Obfuscation là một từ thích hợp hơn cho nó. Tôi đã phát triển một thuật toán nhỏ gọn, nhanh chóng và hy vọng an toàn mà tôi gọi nó là Ayden. Nó thuộc phạm vi công cộng và can be downloaded from Github. Hy vọng nó rất hữu ích.

Các vấn đề liên quan