2012-02-28 39 views
7

Tôi đang cố gắng triển khai một kỹ thuật mã hóa tệp văn bản đơn giản và tôi đang sử dụng mã sau để làm như vậy. Mã không được viết bởi tôi, tôi chỉ googled và đã nhận nó. Kỹ thuật mã hóa có vẻ khá đơn giản, súc tích và dễ thực hiện. Tôi thấy rằng nó chỉ có một chức năng có thể thực hiện mã hóa và giải mã khi đang di chuyển. Chỉ cần vượt qua chính nó sẽ làm các trick. Tuy nhiên, tôi chỉ muốn biết, liệu tôi có thể kiểm tra xem chìa khóa có được thông qua bởi người dùng là chính xác hay không. Hiện tại, nó sẽ chỉ mã hóa/giải mã tệp văn bản dựa trên khóa đã truyền. Nhưng không có cơ chế để kiểm tra xem chúng tôi có đang giải mã bằng khóa chính xác hay không. Bất kể chìa khóa nào chúng ta vượt qua, nó sẽ được giải mã, nhưng nó sẽ không thể đọc được. Bất kỳ ý tưởng làm thế nào để giải quyết vấn đề này ..?Mã hóa tệp văn bản đơn giản dựa trên khóa

procedure TEnDeCrypt.EnDecryptFile(pathin, pathout: string; Chave: Word); 
var 
    InMS, OutMS: TMemoryStream; 
    cnt: Integer; 
    C: byte; 
begin 
    InMS := TMemoryStream.Create; 
    OutMS := TMemoryStream.Create; 
    try 
    InMS.LoadFromFile(pathin); 
    InMS.Position := 0; 
    for cnt := 0 to InMS.Size - 1 DO 
     begin 
     InMS.Read(C, 1); 
     C := (C xor not (ord(chave shr cnt))); 
     OutMS.Write(C, 1); 
     end; 
    OutMS.SaveToFile(pathout); 
    finally 
    InMS.Free; 
    OutMS.Free; 
    end; 
end; 
+0

Tôi không biết tại sao mọi người lại bỏ phiếu! – jimsweb

+2

Đó không phải là tôi, nhưng loại mã hóa này không phải là rất an toàn, và không đáng để đầu tư. Đó là sự xáo trộn hơn mã hóa. Đối với câu hỏi thực sự của bạn: không có cách nào, vì bạn không có hệ thống khóa thực sự có thể xác thực một cách an toàn mà không chứa phần bí mật. –

+0

cảm ơn Marco. Có kỹ thuật nào khác mà tôi có thể đạt được không? Tôi chỉ muốn đảm bảo rằng người dùng đã nhập đúng khóa. Tôi không quan tâm đến sức mạnh của mã hóa. Nó có thể là một đơn giản. – jimsweb

Trả lời

7

Tạo tổng kiểm tra trên văn bản thuần túy bằng thuật toán băm và lưu trữ nó ở đầu tệp được mã hóa.

Bạn có thể xác minh khóa bằng cách băm văn bản được giải mã và đảm bảo rằng tổng kiểm tra khớp với nhau.

Nếu bạn sử dụng thuật toán băm mạnh như SHA256 để tạo tổng kiểm tra, sẽ khó cho người dùng tự động tấn công brute force vì nó sẽ tốn kém tính toán.

Để đảm bảo tệp vẫn còn nguyên, bạn cũng có thể lưu trữ tổng kiểm tra trên tệp được mã hóa và lưu trữ tệp đó trong tiêu đề tệp. Nếu không, sẽ không có cách nào để phân biệt mật khẩu không hợp lệ từ một tệp đã cắt ngắn.

Tôi thường sử dụng thuật toán mã hóa Blowfish, có sẵn cho Delphi từ nhiều nguồn. Blowfish không có điểm yếu được biết đến và khá nhỏ gọn và nhanh chóng.

+1

+1 cho Blowfish –

7

Nếu bạn nhận thức được các loại nội dung tập tin của bạn sẽ có (cho dù đó là một tập tin tập tin nhị phân/văn bản vv), sau đó bạn có thể lấy mẫu văn bản và xem nếu có bất kỳ ký tự ASCII hoặc không được mong đợi trong tệp sau khi giải mã.

Một điều bạn có thể làm là thêm văn bản hình mờ ở cuối tệp. Sau khi giải mã, bạn có thể kiểm tra xem hình mờ của bạn có chứa dữ liệu nằm ngoài kiểu dữ liệu dự kiến ​​không (nếu bạn chỉ mong đợi các ký tự và bạn thấy dữ liệu không phải trong đó, thì có thể có vấn đề). Điều này mặc dù không phải là lừa bằng chứng, chỉ là một loại của một bộ đệm cho bạn.

Điều đó nói rằng, tôi sẽ hỏi bạn câu hỏi này - ý định đằng sau điều này là gì? Chìa khóa người dùng đang chuyển là mã hóa; vì vậy nếu người dùng đang chuyển một khóa không hợp lệ, thì họ sẽ nhận được kết quả không hợp lệ. Tại sao bạn cần phải hướng người dùng về phía bên phải? Và nếu có một số trường hợp sử dụng kinh doanh cho một cái gì đó như thế, sau đó bạn cũng cần phải hiểu rằng điều này sẽ làm cho mã hóa của bạn rất dễ dàng để phá vỡ. Tôi sẽ đề nghị bạn chọn một thuật toán mã hóa tiêu chuẩn và sử dụng thuật toán đó để mã hóa tệp của bạn.

+0

cảm ơn Gangadhar vì đề xuất quý giá của bạn. - Không có sử dụng kinh doanh cho ứng dụng này. Đó là ứng dụng sở thích của tôi. – jimsweb

2

Cách chính xác để thực hiện những gì bạn đang yêu cầu là Mã hóa-sau đó-Xác thực dữ liệu. Có một số thảo luận có liên quan tại đây: Should we MAC-then-encrypt or encrypt-then-MAC?

Cách thông thường là sử dụng mật mã chuẩn ở chế độ chuẩn, chẳng hạn như AES ở chế độ CBC, và sau đó tính toán HMAC (chẳng hạn như HMAC-SHA256) . Ngoài ra còn có một số chế độ mã hóa, chẳng hạn như CCM, EAX, GCM, sẽ thực hiện cả mã hóa và xác thực.

Không dùng sử dụng hàm băm thay vì HMAC cho việc này.

Khóa bạn sử dụng để mã hóa phải độc lập với khóa bạn sử dụng để xác thực. Bạn có thể ví dụ: tạo ra cả hai ngẫu nhiên, nhưng hoàn toàn không bằng cách sử dụng chức năng System.Random. Nếu bạn đang triển khai Vista SP2 trở lên, bạn có thể sử dụng CryptGenRandom từ Windows API, nhưng nếu không bạn nên sử dụng một thư viện mã hóa với sự hỗ trợ cho việc tạo số ngẫu nhiên mã hóa.

Nếu bạn sử dụng mã hóa dựa trên mật khẩu, hãy sử dụng triển khai PBKDF2 để phát sinh khóa mã hóa và khóa xác thực. Có bốn cách phổ biến để đảm bảo hai khóa độc lập:

  • Sử dụng hai giá trị muối riêng biệt;
  • Sử dụng một muối đơn lẻ nhưng nối nó với các "nhãn" riêng biệt, ví dụ: các chuỗi 'E' và 'A' tương ứng,
  • Tạo khóa có thời lượng dài gấp hai lần và sử dụng một nửa làm khóa mã hóa và nửa còn lại dưới dạng khóa xác thực hoặc
  • Để khóa có nguồn gốc là "khóa mã hóa khóa "bạn sử dụng để mã hóa các khóa mã hóa và khóa xác thực được tạo ngẫu nhiên.
Các vấn đề liên quan