Phần thử thách chủ yếu là về xử lý hình ảnh chứ không phải nhiều về tiền điện tử.
Bạn muốn trích xuất đủ entropy từ hình ảnh theo cách đáng tin cậy.
Nó liên quan nhiều đến cách bạn sử dụng hình ảnh và mô hình đối thủ của bạn.
Nếu đối thủ của bạn hoàn toàn không biết gì về hình ảnh, thì một số đặc điểm thô sơ đơn giản có thể là đủ, nếu đối thủ của bạn biết nhiều về hình ảnh, chẳng hạn như đã nhìn thoáng qua hoặc biết gần đúng nơi nó được chụp, bạn cần phải cẩn thận hơn về thông tin nào được trích xuất từ hình ảnh và sẽ cần sử dụng các tính năng hình ảnh chi tiết hơn, điều này sẽ khó trích xuất theo cách ổn định.
Nếu mỗi lần sử dụng, hình ảnh được quét trong cùng một máy quét chất lượng cao và giữa các lần sử dụng, hình ảnh được lưu giữ an toàn để không bị phai màu, nhăn nheo hoặc tích tụ bụi thì sẽ dễ dàng hơn nếu các bản quét ở rất gần nhau và chỉ có tự động căn chỉnh và phân biệt đơn giản (không gian và màu sắc) để có được chuỗi bit gần như giống nhau mỗi lần.
Sau đó, câu hỏi đặt ra là mô hình lỗi chúng tôi có cho kết quả quét là gì? Chúng ta có mong đợi tiếng ồn gaussian không? muối và hạt tiêu? căn chỉnh tiếng ồn? Vòng xoay? bổ sung các mảnh lớn liên tục của tiếng ồn? ánh sáng tiếng ồn?
Mỗi loại tiếng ồn có thể được xử lý khác nhau.
Phác thảo chung cho một giải pháp: Chúng tôi sử dụng các kỹ thuật xử lý hình ảnh để giảm thiểu nhiễu để chuyển sang một biểu diễn giúp loại bỏ hầu hết chúng, sau đó bạn giới hạn không gian ở chỉ một số điểm hợp lệ nhất định và chọn điểm hợp lệ gần nhất với điểm chúng tôi phải giảm nhiễu. về không.
Chúng tôi sẽ phân biệt đủ mạnh và chọn đủ các điểm hợp lệ thưa thớt để cho phép chúng tôi đạt được độ ồn bằng 0 một cách đáng tin cậy. Tại thời điểm này, chúng ta vẫn có nhiều hơn độ dài khóa cần thiết nhưng trong một không gian vẫn liên quan chặt chẽ với hình ảnh gốc và do đó, các bit sẽ bị sai lệch và tương quan.
Việc áp dụng hàm băm mật mã cho dữ liệu đó sẽ phân loại dữ liệu đó và cho phép chúng tôi có đủ tài liệu khóa chất lượng cao được lấy một cách đáng tin cậy và nhận được cùng một khóa chính xác bất cứ khi nào bạn quét. Điều này có thể được sử dụng như một khóa AES.
Nếu bạn muốn tạo khóa RSA, bạn sẽ cần nhiều bit ngẫu nhiên hơn. Tuy nhiên, bạn có thể trích xuất bao nhiêu bit tùy thích trong khi vẫn nhận được các bit giống nhau một cách đáng tin cậy mỗi lần và sử dụng số đó để tạo PRNG mật mã và sử dụng nó để tạo khóa riêng RSA.
Chỉnh sửa: Tôi đã không cố gắng thực hiện một giải pháp đầy đủ, nhưng tôi đã mở một cuốn sổ tay và chơi với mô hình tiếng ồn được đề xuất, tiếng ồn gaussian và sự dịch chuyển mà tôi tin là được sửa dễ dàng, vì vậy tôi đã kiểm tra xem điều gì sẽ xảy ra nếu tôi xoay hình ảnh (với phép nội suy) 2 độ và xoay ngược lại 1,8 độ, tôi nhận được độ chênh lệch tối đa (trên hình ảnh bên trên) là 33%, điều này chứng minh cho tuyên bố của tôi rằng bằng cách xác định xoay và dịch chuyển bộ đếm tốt nhất, giảm độ phân giải và định lượng mạnh mẽ, bỏ qua các cạnh, chúng ta nên có thể nhận được 1-2 bit trên mỗi kênh trên ~25 vùng pixel. Đối với hình ảnh trên, nó có ít nhất 36K bit và sau khi băm, tôi cá rằng nó sẽ có 128 bit entropy thực tế
Chỉnh sửa 2: Tôi đã tải xuống các hình ảnh quét tỷ lệ xám được cung cấp và chơi với chúng, tôi căn chỉnh bán tự động khi xoay hai hình ảnh đầu tiên.
img = io.imread("quét/scan078.tif")
img2 = io.imread("quét/scan079.tif")
imgr = transform.rotate(img,angle = -0,78)
imgr2 = transform.rotate(img2,angle = -0,805)
tr1=transform.rescale(imgr[:-10,:-6],0.1)[20:-20,20:-20]
tr2=transform.rescale(imgr2[10:,6:],0.1)[20:-20,20:-20]
Việc đọc này sẽ xoay từng căn chỉnh và cắt xén, lấy mẫu xuống 10 lần và cắt xén để loại bỏ các cạnh có thể có tạo tác.
Điều này mang lại sự khác biệt Tối đa dưới 6% cho mỗi giá trị pixel. Đó là khá tốt. Tuy nhiên, mức chênh lệch 6% này có thể dễ dàng nằm xung quanh bất kỳ giới hạn nào mà chúng tôi chọn, vì vậy ngay cả khi lượng tử hóa mạnh mẽ cũng không đưa ra 0 lỗi.
bin1 = tr1 > 0,5
bin2 = tr2 > 0,5
Điều này đã tạo ra sự khác biệt ở 103 bit trong số 27248 bit hoặc 0,37% Các lỗi này dường như được trải ra một cách hợp lý.
Việc thay đổi kích thước và định lượng tích cực này làm mất rất nhiều thông tin nhưng có lẽ chúng ta vẫn có đủ.
Đây là những gì hình ảnh trông giống như:
Các lỗi được trải đều khá tốt (và chúng ta luôn có thể áp dụng một hoán vị cố định hoặc sử dụng các ký hiệu lớn hơn nếu cần). Vì vậy, bây giờ chúng tôi có thể áp dụng bất kỳ bước sửa lỗi nào (ví dụ: Reed solomon), chúng tôi sẽ chỉ thực hiện bước giải mã (không thực sự làm điều này) và chúng tôi sẽ nhận được cùng một đầu ra từ một trong hai hình ảnh có khả năng cao và vẫn có ~ 20K bit.
Nếu chúng tôi giảm tỷ lệ 5x thay vì 10x, chúng tôi nhận được 816 bit khác nhau. nhưng nhận được gấp 4 lần số bit, với mức chênh lệch 0,6%. Có thể chơi với điều này và tìm thấy tối ưu.
Chúng tôi cũng có thể làm tốt hơn ở bước lượng tử hóa và lưu giữ nhiều thông tin hơn một cách đáng tin cậy. Lượng tử hóa tích cực mà tôi đã sử dụng sẽ chỉ hoạt động đối với những bức ảnh được cân bằng hợp lý, một bức ảnh bị phơi sáng quá mức sẽ xuất hiện tất cả một giá trị duy nhất. Chúng tôi có thể thêm tiền xử lý để xử lý tình huống này.