Điểm:0

Văn bản một chiều—chức năng văn bản

lá cờ jp

Tôi cần một cách để ánh xạ một số văn bản có thể in sang văn bản có thể in khác. Ví dụ.:

Ian Boyd â Kcp Zbas

Lưu ý một số yêu cầu quan trọng:

  • chữ hoa là chữ hoa trong đầu ra
  • chữ thường trong đầu vào là chữ thường trong đầu vào
  • không gian (và bất cứ thứ gì khác bên ngoài A-Z0-9) được để yên

Yêu cầu bổ sung là nó được xác định, đó là cùng một đầu vào luôn cho cùng một đầu ra:

  • Ian Boyd â Xbas Kcp
  • Ian Boyd â Xbas Kcp
  • Ian Boyd â Xbas Kcp

Yêu cầu khác mở rộng về thuyết xác định và tôi không biết gọi nó là gì ngoại trừ việc nói rằng các từ có tiền tố chung cần phải có cùng một đầu ra cho cùng một tiền tố chung:

  • Tôi â K
  • tôi â Kc
  • Ian â Kcp
  • Ian â Kcp
  • Ian B â Kcp X
  • Ian Bo â Kcp Xb
  • Ian Boy â KcpXba
  • Ian Boyd â Kcp xbap

Giải pháp của tôi

Tôi đã tạo ra một giải pháp cho những yêu cầu kỹ thuật này 15 năm trước; nhưng tôi đang cố gắng xem lại nó một số thứ "tốt hơn".

giải pháp của tôi là một "một mật mã Caesar trực tuyến với chuỗi".

Tạo một sự thay thế caesar đơn giản:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
F H U D I R Y E K C Z N S A B G J P V O W T L M Q X

Nhưng thay vì một sự thay thế đơn giản:

  • Ian Boyd â Fks Hbqd

thay vào đó tôi đã sử dụng chuỗi:

Trạng thái trước Tổng ký tự hiện tại (mod) Đầu ra ký tự tiếp theo
-------------- ----------------- ---------- --------- ----- --------------------
0 Tôi (9) 9 K K
9 a (1) 10 c Kc
10 n (14) 24 p Kcp

24 B (2) 26 X Kcp X
26 o (15) 15 b Kcp Xb
15 y (25) 14 a Kcp Xba
14 d (4) 18 m Kcp Xbap

Giải pháp tốt hơn với băm?

Những giá trị này không phải là thứ tôi cần (hoặc muốn) "giải mã"và việc sử dụng mật mã caesar ngụ ý khả năng giải mã (điều mà tất cả chúng ta đều biết là không khó đến thế).

Vì vậy, về mặt khái niệm tôi thực sự muốn một "chức năng một chiều": một cái gì đó mà:

  • chuyển đổi đầu vào
  • đến một số đầu ra không thể đoán trước
  • một cách xác định

Tôi nghĩ: điều gì sẽ xảy ra nếu tôi sử dụng thuật toán băm, thêm từng chữ cái một và nhận được giá trị hiện tại "tiểu bang"và chuyển đổi thông báo một phần đó thành một ký tự (chữ hoa/chữ thường/chữ số phù hợp để khớp với đầu vào):

   Chuỗi FrobTheGrobber(Đầu vào chuỗi)
   {
      // bằng chứng về mã giả khái niệm chỉ xử lý chữ hoa
      HashAlgorithm hash = new SHA256();
      hash.AddBytes(SECRET_KEY);

      Chuỗi res = "";

      cho Char ch trong đầu vào
      {
         băm.Add(ch);
         int charCode = (hash.Hash[0] % 26) + 1; // sử dụng byte đầu tiên, mod 26 để nhận giá trị từ 0..25
         res += Char(Ord('A') + charCode;
      }            
   }

Tôi biết; bạn ghét yêu cầu.

Bất cứ ai có thể điều gì tốt hơn?

DannyNiu avatar
lá cờ vu
Nhập mật mã Caesar và làm cho nó hoạt động giống như chức năng nén Davies-Meyer?
DannyNiu avatar
lá cờ vu
Thuộc tính tiền tố-idempotence làm cho việc đảo ngược ánh xạ trở nên khó khăn *không*.
fgrieu avatar
lá cờ ng
Thuộc tính tiền tố có ngụ ý rằng nếu `I` â `K`, thì `i` â `k`, hay `i` â `z`? Rằng nếu `Ian â Kcp ` thì `Ian Ian` â `Kcp Kcp`, hay `Ian Ian` â `Kcp Zar`?
lá cờ jp
@fgrieu Để đơn giản, đó là *"không phân biệt chữ hoa chữ thường"*, tức là `i` và `I` đều ánh xạ tới `k` và `K`. Giải pháp đầy đủ cũng bao gồm `0`-`9` trong mật mã Caesar. Bằng cách này, những thứ như số điện thoại ánh xạ tới thứ gì đó cũng trông giống số điện thoại ( `905-867-5309` → `619-112-8408`). Và tôi cũng có thể lập bản đồ chữ thường riêng biệt với chữ hoa. Dù bằng cách nào: không quan trọng. Nếu ai đó có thể đưa ra giải pháp cho `A`-`Z`, tôi có thể mở rộng nó sang bất kỳ ký tự nào khác.
SAI Peregrinus avatar
lá cờ si
Bạn sẽ xử lý i và ι như thế nào mà cả hai đều ánh xạ tới tôi? Chỉ cần bỏ qua Thổ Nhĩ Kỳ? Phân biệt chữ hoa chữ thường hầu như luôn là một ý tưởng KHỦNG KHIẾP, nó luôn bị mất.
lá cờ jp
@SAIPeregrinus Câu hỏi không cần những chi tiết đó. Đối với mục đích của câu hỏi này, bạn chỉ phải giải quyết việc xử lý `A-Z`. Trả lời điều đó, và tôi sẽ xử lý phần còn lại. Phần còn lại là tầm thường để xử lý và hoàn toàn không liên quan đến câu hỏi của tôi. Nếu nó giúp ích cho bạn: giả sử hệ thống nguồn sử dụng trang mã 5 bit, trang này chỉ xác định các ký tự `A`-`Z`. Sau khi nói tất cả những điều đó, bạn biết **chính xác** tôi sẽ xử lý bài kiểm tra gà tây như thế nào - nhưng đó không phải là một phần câu hỏi của tôi vì nó không quan trọng đối với câu hỏi, cũng không phải là câu hỏi tôi đang hỏi.
jjj avatar
lá cờ cn
jjj
Với yêu cầu tiền tố, nó không thể là một chiều, bởi vì người ta có thể dễ dàng tái tạo lại ký tự này cho ký tự khác.
Ievgeni avatar
lá cờ cn
Tôi không hiểu đó là những yêu cầu bảo mật?
Điểm:1
lá cờ ng

Vấn đề với giải pháp ban đầu của câu hỏi là bảng thay thế giống nhau ở mỗi chỉ mục và phần tốt hơn của khóa. Do đó, nó có thể được xác định từ các ví dụ. Vấn đề với giải pháp "tốt hơn" là biết một giá trị ban đầu Tôi mã hóa thành K, chúng tôi biết một ban đầu Một mã hóa thành C, ban đầu b mã hóa thành Đ., vân vân..

Tôi đề xuất như sau, với hàm băm ít nhất 256 bit $H$ chẳng hạn như SHA-256 và khóa $K$:

  • bộ $y=\mathtt{\text{â0â}}$
  • cho mỗi ký tự $x$ để mã hóa hoặc giải mã
    • để cho $b=0$
    • nếu $x$ là một chữ số, hãy để $b=10$ và để cho $c=\mathtt{\text{â0â}}$
    • nếu $x$ là một chữ cái viết hoa, hãy để $b=26$ và để cho $c=\mathtt{\text{âAâ}}$
    • nếu $x$ là một chữ thường, đặt $b=26$ và để cho $c=\mathtt{\text{âaâ}}$
    • nếu $b\ne0$
      • bộ $K=H(K\mathbin\|\operatorname{uppercase}(y)\mathbin\|b)$
      • chuẩn bị hoán vị $p$ của $b$ các phần tử được khóa bởi giá trị hiện tại của $K$; và hướng tới điều này:
        • đặt số nguyên $r=K$ (theo quy ước big-endian)
        • $i=0$ đến $b-1$
          • bộ $j=r\bmod(i+1)$, sau đó $r=\lfloor r/(i+1)\rfloor$
          • bộ $p[i]=i$
          • bộ $p[i]=p[j]$
          • bộ $p[j]=i$
      • nếu mã hóa
        • bộ $y=x$
        • bộ $x=p[x-c]+c$
      • nếu không thì
        • bộ $x=p^{-1}[x-c]+c$
        • bộ $y=x$
    • đầu ra $x$

Và điều này mang lại kết quả:

Nhập ký tự xáo trộn
Tôi b
tôi bf
Ian bfd
Ian bfd
Ian B Bfd K
Ian Bo Bfd Kf
Ian Boy Bfd Kft
Ian Boyd bfd kftv
Ian Boyd bfd kftv
Ian Boyd 2 Bfd Kftv 2
Ian Boyd 20 Bfd Kftv 25
Ian Boyd 201 Bfd Kftv 257
Ian Boyd 2017 Bfd Kftv 2571

Hãy dùng thử trực tuyến! trong Python.

Các $K=H(K\mathbin\|\operatorname{uppercase}(y)\mathbin\|b)$ bước chuẩn bị một khóa mới phụ thuộc vào khóa trước đó, vào ký tự trước đó (được chuẩn hóa thành chữ hoa, vì không rõ liệu viết hoa có ảnh hưởng gì đến các ký tự tiếp theo hay không) và vào việc ký tự hiện tại có phải là chữ số hay không (vì các quy tắc cho phép và chúng tôi muốn phụ thuộc vào càng nhiều càng tốt). Tại mỗi bước, $256-\log_2(26!)>167,6$ một chút trạng thái vẫn chưa được biết đối với kẻ tấn công ngay cả trong một cuộc tấn công bằng văn bản đã chọn. Chúng tôi đã xây dựng một hoán vị có kích thước phù hợp theo ký tự hiện tại, theo hướng phù hợp để mã hóa hoặc giải mã.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.