Format-Preserving

如何使用格式保留加密來加密日期並避免衝突

  • August 6, 2015

我正在使用 C# 中的 FPE 算法進行加密。我所做的是將要加密的日期轉換為年份值和年份值。

string input = "1901-01-01";
DateTimeOffset parsedDateOffset = new DateTimeOffset();
bool parsed = false;
parsed = DateTimeOffset.TryParseExact(input, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces, out parsedDateOffset);

if(parsed){

   DateTime dtNew = new DateTime(parsedDateOffset.Year, parsedDateOffset.Month, parsedDateOffset.Day);
   int dayOfYear = dtNew.DayOfYear;
   int yyyy = parsedDateOffset.Year;

// Then I encrypt the day of year separate from the year

   int encodedDay = FE11.Encrypt(365, dayOfYear, Encoding.UTF8.GetBytes(input.ToString()), Encoding.UTF8.GetBytes("0"));
   int encodedYear= FE11.Encrypt(2015 - 1901, yyyy, Encoding.UTF8.GetBytes(input.ToString()), Encoding.UTF8.GetBytes("0"));

// Then combine them together again taking into account leap year

    DateTime encodedDate = new DateTime((int)encodedYear, 1, 1).AddDays((int)encodedDay - 1);;
    if (DateTime.IsLeapYear((int)encodedYear))
    {
        encodedDate.AddDays(1);
    }   
}

但是我遇到了重複的日期(即兩個純文字日期導致相同的加密日期)但是使用格式保留加密不應該是這種情況,我知道這是因為我將年份與日期分開加密的方式年。

有沒有人有任何建議來克服這個問題?我嘗試引入一個調整,但問題仍然存在。

理想情況下,我只想加密一個值。但是僅加密一年中的某一天仍然需要我在呈現最終加密結果時將其置於一年的上下文中。

除了一年中的某一天之外,還有其他可能有用的日期表示嗎?

編輯: 我此時使用的 FPE 庫稱為 DotFPE,位於此處https://dotfpe.codeplex.com/(據說是 Botan Crypto 的格式保留模組的一個埠)

所以,在評論中,你說

我使用原始日期作為關鍵

這就是重複日期的原因。對於固定密鑰,加密是完全確定的。但是,當您更改密鑰時,情況並非如此。因此,215用密鑰加密數字可能會產生與用密鑰加密215數字相同的密文,這是完全合理的。但是,應該保證使用相同的密鑰對數字和每個數字進行加密,例如,會產生不同的密文(假設您沒有使用調整或使用固定調整)。10``10``215``10``111

如果你有一個固定的隨機密鑰,那麼你應該得到不同的密文。添加隨機的、每條消息的“調整”也可能導致這種行為。

因此,您可以通過在任何地方使用相同的密鑰而不進行任何調整來解決這個“問題”。然而,這確實讓我害怕。您在具有相當小的域的應用程序中使用確定性加密。根據具體的應用程序,可能會使您容易受到頻率攻擊或其他攻擊。

引用自:https://crypto.stackexchange.com/questions/27364