<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-denis-ipcrypt-04" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.0 -->
  <front>
    <title abbrev="ipcrypt">Methods for IP Address Encryption and Obfuscation</title>
    <seriesInfo name="Internet-Draft" value="draft-denis-ipcrypt-04"/>
    <author initials="F." surname="Denis" fullname="Frank Denis">
      <organization>Fastly Inc.</organization>
      <address>
        <email>fde@00f.net</email>
      </address>
    </author>
    <date year="2025"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 118?>

<t>This document specifies methods for encrypting and obfuscating IP addresses, providing both deterministic format-preserving and non-deterministic constructions. These methods address privacy concerns raised in <xref target="RFC6973"/> and <xref target="RFC7258"/> regarding pervasive monitoring and data collection.</t>
      <t>The methods apply uniformly to both IPv4 and IPv6 addresses by converting them into a 16-byte representation. Two generic constructions are defined—one using a 128-bit block cipher and the other using a 128-bit tweakable block cipher—along with three concrete instantiations:</t>
      <ul spacing="normal">
        <li>
          <t><strong><tt>ipcrypt-deterministic</tt>:</strong> Deterministic encryption using AES-128 as a single-block operation.</t>
        </li>
        <li>
          <t><strong><tt>ipcrypt-nd</tt>:</strong> Non-deterministic encryption using the KIASU-BC tweakable block cipher with an 8-byte tweak.</t>
        </li>
        <li>
          <t><strong><tt>ipcrypt-ndx</tt>:</strong> Non-deterministic encryption using the AES-XTS tweakable block cipher with a 16-byte tweak.</t>
        </li>
      </ul>
      <t>Deterministic mode produces a 16-byte ciphertext enabling format preservation. Non-deterministic modes prepend a randomly sampled tweak to produce larger ciphertexts that resist correlation attacks. When generated, tweaks MUST be uniformly random as specified in <xref target="RFC4086"/>.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/jedisct1/draft-denis-ipcrypt"/>.</t>
    </note>
  </front>
  <middle>
    <?line 130?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies methods for the encryption and obfuscation of IP addresses for both operational use and privacy preservation. The objective is to enable network operators, researchers, and privacy advocates to share or analyze data while protecting sensitive address information.</t>
      <t>This work addresses concerns raised in <xref target="RFC7624"/> regarding confidentiality in the face of pervasive surveillance. The security properties of these methods are discussed throughout this document and summarized in <xref target="security-considerations"/>.</t>
      <section anchor="licensing">
        <name>Licensing</name>
        <t><em>This section is to be removed before publishing as an RFC.</em></t>
        <t>Implementations of the ipcrypt methods are freely available under permissive open source licenses (MIT, BSD, or Apache 2.0) at the repository listed in the Implementation Status section.</t>
        <t>There are no known patent claims on these methods.</t>
      </section>
      <section anchor="use-cases-and-motivations">
        <name>Use Cases and Motivations</name>
        <t>The main motivations include:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Privacy Protection:</strong> Encrypting IP addresses prevents the disclosure of user-specific information when data is logged or measured, as discussed in <xref target="RFC6973"/>.</t>
          </li>
          <li>
            <t><strong>Format Preservation:</strong> Ensuring that the encrypted output remains a valid IP address allows network devices to process the data without modification. See <xref target="format-preservation"/> for details.</t>
          </li>
          <li>
            <t><strong>Mitigation of Correlation Attacks:</strong> Deterministic encryption reveals repeated inputs; non-deterministic modes use a random tweak to obscure linkability while keeping the underlying input confidential. See <xref target="non-deterministic-encryption"/> for implementation details.</t>
          </li>
          <li>
            <t><strong>Privacy-Preserving Analytics:</strong> Many common operations like counting unique clients or implementing rate limiting can be performed using encrypted IP addresses without ever accessing the original values. This enables privacy-preserving analytics while maintaining functionality.</t>
          </li>
          <li>
            <t><strong>Third-Party Service Integration:</strong> IP addresses are private information that should not be sent in cleartext to potentially untrusted third-party services or cloud providers. Using encrypted IP addresses as keys or identifiers allows integration with external services while protecting user privacy.</t>
          </li>
        </ul>
        <t>For implementation examples, see <xref target="pseudocode-and-examples"/>.</t>
      </section>
      <section anchor="relationship-to-ietf-work">
        <name>Relationship to IETF Work</name>
        <t><em>This section is to be removed before publishing as an RFC.</em></t>
        <t>This document does not conflict with any active IETF working group efforts. While the IETF has produced several RFCs related to privacy (<xref target="RFC6973"/>, <xref target="RFC7258"/>, <xref target="RFC7624"/>), there is no current standardization effort for IP address encryption methods. This specification complements existing IETF privacy guidance by providing concrete implementation methods.</t>
        <t>The cryptographic primitives used (AES, format-preserving encryption) align with IETF cryptographic recommendations, and the document follows IETF formatting and terminology conventions where applicable.</t>
      </section>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in BCP 14 <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
      <t>Throughout this document, the following terms and conventions apply:</t>
      <ul spacing="normal">
        <li>
          <t><strong>IP Address:</strong> An IPv4 or IPv6 address as defined in <xref target="RFC4291"/>.</t>
        </li>
        <li>
          <t><strong>16-Byte Representation:</strong> A fixed-length representation used for both IPv4 (via IPv4-mapped IPv6) and IPv6 addresses.</t>
        </li>
        <li>
          <t><strong>Tweak:</strong> A non‑secret, additional input to a tweakable block cipher that further randomizes the output.</t>
        </li>
        <li>
          <t><strong>Deterministic Encryption:</strong> Encryption that always produces the same ciphertext for a given input and key.</t>
        </li>
        <li>
          <t><strong>Non-Deterministic Encryption:</strong> Encryption that produces different ciphertexts for the same input due to the inclusion of a randomly sampled tweak.</t>
        </li>
        <li>
          <t><strong>(Input, Tweak) Collision:</strong> A scenario where the same input is encrypted with the same tweak. This reveals that the input was repeated but not the input’s value.</t>
        </li>
      </ul>
    </section>
    <section anchor="ip-address-conversion">
      <name>IP Address Conversion</name>
      <t>This section describes the conversion of IP addresses to and from a 16-byte representation. This conversion is necessary to operate a 128-bit cipher on both IPv4 and IPv6 addresses.</t>
      <section anchor="converting-to-a-16byte-representation">
        <name>Converting to a 16‑Byte Representation</name>
        <section anchor="ipv6-addresses">
          <name>IPv6 Addresses</name>
          <t>IPv6 addresses are natively 128 bits and are converted directly using network byte order (big-endian) as specified in <xref target="RFC4291"/>.</t>
          <t><em>Example:</em></t>
          <artwork><![CDATA[
IPv6 Address:    2001:0db8:85a3:0000:0000:8a2e:0370:7334
16-Byte Representation: [20 01 0d b8 85 a3 00 00 00 00 8a 2e 03 70 73 34]
]]></artwork>
        </section>
        <section anchor="ipv4-addresses">
          <name>IPv4 Addresses</name>
          <t>IPv4 addresses (32 bits) are mapped using the IPv4-mapped IPv6 format as specified in <xref target="RFC4291"/>:</t>
          <artwork><![CDATA[
IPv4 Address:    192.0.2.1
16-Byte Representation: [00 00 00 00 00 00 00 00 00 00 FF FF C0 00 02 01]
]]></artwork>
        </section>
      </section>
      <section anchor="converting-from-a-16-byte-representation-to-an-ip-address">
        <name>Converting from a 16-Byte Representation to an IP Address</name>
        <t>The conversion algorithm is as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>Examine the first 12 bytes of the 16-byte representation</t>
          </li>
          <li>
            <t>If they match the IPv4-mapped prefix (10 bytes of 0x00 followed by 0xFF, 0xFF):
            </t>
            <ul spacing="normal">
              <li>
                <t>Interpret the last 4 bytes as an IPv4 address in dotted-decimal notation</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Otherwise:
            </t>
            <ul spacing="normal">
              <li>
                <t>Interpret the 16 bytes as an IPv6 address in colon-hexadecimal notation</t>
              </li>
            </ul>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="generic-constructions">
      <name>Generic Constructions</name>
      <t>This specification defines two generic cryptographic constructions:</t>
      <ol spacing="normal" type="1"><li>
          <t><strong>128-bit Block Cipher Construction:</strong>
          </t>
          <ul spacing="normal">
            <li>
              <t>Used in deterministic encryption (see <xref target="deterministic-encryption"/>)</t>
            </li>
            <li>
              <t>Operates on a single 16-byte block</t>
            </li>
            <li>
              <t>Example: AES-128 treated as a permutation</t>
            </li>
          </ul>
        </li>
        <li>
          <t><strong>128-bit Tweakable Block Cipher (TBC) Construction:</strong>
          </t>
          <ul spacing="normal">
            <li>
              <t>Used in non-deterministic encryption (see <xref target="non-deterministic-encryption"/>)</t>
            </li>
            <li>
              <t>Accepts a key, a tweak, and a message</t>
            </li>
            <li>
              <t>The tweak must be uniformly random when generated</t>
            </li>
            <li>
              <t>Reuse of the same tweak on different inputs does not compromise confidentiality</t>
            </li>
          </ul>
        </li>
      </ol>
      <t>Valid options for implementing a tweakable block cipher include, but are not limited to:</t>
      <ul spacing="normal">
        <li>
          <t><strong>SKINNY</strong> (see <xref target="SKINNY"/>)</t>
        </li>
        <li>
          <t><strong>DEOXYS-BC</strong> (see <xref target="DEOXYS-BC"/>)</t>
        </li>
        <li>
          <t><strong>KIASU-BC</strong> (see <xref target="implementing-kiasu-bc"/> for implementation details)</t>
        </li>
        <li>
          <t><strong>AES-XTS</strong> (see <xref target="ipcrypt-ndx"/> for usage)</t>
        </li>
      </ul>
      <t>Implementers MUST choose a cipher that meets the required security properties and provides robust resistance against related-tweak and other cryptographic attacks.</t>
    </section>
    <section anchor="deterministic-encryption">
      <name>Deterministic Encryption</name>
      <t>Deterministic encryption applies a 128-bit block cipher directly to the 16-byte representation of an IP address. All instantiations documented in this specification (<tt>ipcrypt-deterministic</tt>, <tt>ipcrypt-nd</tt>, and <tt>ipcrypt-ndx</tt>) are invertible - encrypted IP addresses can be decrypted back to their original values using the same key. For non-deterministic modes, the tweak must be preserved along with the ciphertext to enable decryption.</t>
      <t>For implementation details, see <xref target="pseudocode-and-examples"/>.</t>
      <section anchor="ipcrypt-deterministic">
        <name>ipcrypt-deterministic</name>
        <t>The <tt>ipcrypt-deterministic</tt> instantiation employs AES-128 in a single-block operation. The key MUST be exactly 16 bytes (128 bits) in length. Since AES-128 is a permutation, every distinct 16-byte input maps to a unique 16-byte ciphertext, preserving the IP address format.</t>
        <t>For test vectors, see <xref target="ipcrypt-deterministic-test-vectors"/>.</t>
        <artwork><![CDATA[
      +---------------------+
      |      IP Address     |
      |    (IPv4 or IPv6)   |
      +---------------------+
                 |
                 v
      +---------------------+
      | Convert to 16 Bytes |
      +---------------------+
                 |
                 v
      +---------------------+
      |   AES128 Encrypt    |
      |   (Single Block)    |
      +---------------------+
                 |
                 v
      +---------------------+
      |    16-Byte Output   |
      +---------------------+
                 |
                 v
      +---------------------+
      | Convert to IP Format|
      +---------------------+
]]></artwork>
      </section>
      <section anchor="format-preservation">
        <name>Format Preservation</name>
        <ul spacing="normal">
          <li>
            <t>If the 16-byte ciphertext begins with an IPv4-mapped prefix, it MUST be rendered as a dotted-decimal IPv4 address.</t>
          </li>
          <li>
            <t>Otherwise, it is interpreted as an IPv6 address.</t>
          </li>
        </ul>
        <t>To ensure IPv4 format preservation, implementers MUST consider using cycle-walking (repeatedly encrypting until a valid IPv4-mapped address is obtained), a 32-bit random permutation, or a Format-Preserving Encryption (FPE) mode as specified in <xref target="NIST-SP-800-38G"/>.</t>
      </section>
    </section>
    <section anchor="non-deterministic-encryption">
      <name>Non-Deterministic Encryption</name>
      <t>Non-deterministic encryption leverages a tweakable block cipher together with a random tweak. For implementation details, see <xref target="pseudocode-and-examples"/>.</t>
      <section anchor="encryption-process">
        <name>Encryption Process</name>
        <t>The encryption process for non-deterministic modes consists of the following steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Generate a random tweak using a cryptographically secure random number generator</t>
          </li>
          <li>
            <t>Convert the IP address to its 16-byte representation</t>
          </li>
          <li>
            <t>Encrypt the 16-byte representation using the key and the tweak</t>
          </li>
          <li>
            <t>Concatenate the tweak with the encrypted output to form the final ciphertext</t>
          </li>
        </ol>
        <t>The tweak is not considered secret and is included in the ciphertext. This allows the same tweak to be used for decryption.</t>
      </section>
      <section anchor="decryption-process">
        <name>Decryption Process</name>
        <t>The decryption process consists of the following steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Split the ciphertext into the tweak and the encrypted IP</t>
          </li>
          <li>
            <t>Decrypt the encrypted IP using the key and the tweak</t>
          </li>
          <li>
            <t>Convert the resulting 16-byte representation back to an IP address</t>
          </li>
        </ol>
        <t>Although the tweak is generated uniformly at random, occasional collisions may occur according to birthday bounds. Such collisions are benign when they occur with different inputs. An <tt>(input, tweak)</tt> collision reveals that the same input was encrypted with the same tweak but does not disclose the input’s value. The usage limits discussed below apply per cryptographic key; rotating keys can extend secure usage beyond these bounds.</t>
      </section>
      <section anchor="output-format-and-encoding">
        <name>Output Format and Encoding</name>
        <t>The output of non-deterministic encryption is binary data. For applications that require text representation (e.g., logging, JSON encoding, or text-based protocols), the binary output MUST be encoded. Common encoding options include hexadecimal and Base64. The choice of encoding is application-specific and outside the scope of this specification. However, implementations SHOULD document their chosen encoding method clearly.</t>
      </section>
      <section anchor="concrete-instantiations">
        <name>Concrete Instantiations</name>
        <t>This document defines two concrete instantiations:</t>
        <ul spacing="normal">
          <li>
            <t><strong><tt>ipcrypt-nd</tt>:</strong> Uses the KIASU-BC tweakable block cipher with an 8-byte (64-bit) tweak. See <xref target="KIASU-BC"/> for details.</t>
          </li>
          <li>
            <t><strong><tt>ipcrypt-ndx</tt>:</strong> Uses the AES-XTS tweakable block cipher with a 16-byte (128-bit) tweak. See <xref target="XTS-AES"/> for background.</t>
          </li>
        </ul>
        <t>In both cases, if a tweak is generated randomly, it MUST be uniformly random. Reusing the same randomly generated tweak on different inputs is acceptable from a confidentiality standpoint.</t>
        <t>For test vectors, see <xref target="ipcrypt-nd-test-vectors"/> and <xref target="ipcrypt-ndx-test-vectors"/>.</t>
        <section anchor="ipcrypt-nd">
          <name>ipcrypt-nd (KIASU-BC)</name>
          <t>The <tt>ipcrypt-nd</tt> instantiation uses the KIASU-BC tweakable block cipher with an 8-byte (64-bit) tweak. For implementation details, see <xref target="implementing-kiasu-bc"/>. The output is 24 bytes total, consisting of an 8-byte tweak concatenated with a 16-byte ciphertext.</t>
          <t>Random sampling of an 8-byte tweak yields an expected collision for a specific tweak value after about 2^(64/2) = 2^32 operations (approximately 4 billion operations). If an <tt>(input, tweak)</tt> collision occurs, it indicates that the same input was processed with that tweak without revealing the input’s value.</t>
          <t>These collision bounds apply per cryptographic key. By rotating keys regularly, secure usage can be extended well beyond these bounds. The effective security is determined by the underlying block cipher’s strength.</t>
          <t>For test vectors, see <xref target="ipcrypt-nd-test-vectors"/>.</t>
        </section>
        <section anchor="ipcrypt-ndx">
          <name>ipcrypt-ndx (AES-XTS)</name>
          <t>The <tt>ipcrypt-ndx</tt> instantiation uses the AES-XTS tweakable block cipher with a 16-byte (128-bit) tweak. The output is 32 bytes total, consisting of a 16-byte tweak concatenated with a 16-byte ciphertext.</t>
          <t>For AES-XTS encryption of a single block, the computation avoids the sequential tweak calculations required in full XTS mode. Independent sampling of a 16-byte tweak results in an expected collision after about 2^(128/2) = 2^64 operations (approximately 18 quintillion operations).</t>
          <t>As with <tt>ipcrypt-nd</tt>, an <tt>(input, tweak)</tt> collision reveals repetition without compromising the input value. These limits are per key, and regular key rotation further extends secure usage. The effective security is governed by the strength of AES-128 (approximately 2^128 operations).</t>
        </section>
        <section anchor="comparison-of-modes">
          <name>Comparison of Modes</name>
          <ul spacing="normal">
            <li>
              <t><strong>Deterministic (<tt>ipcrypt-deterministic</tt>):</strong>
Produces a 16-byte output; preserves format but reveals repeated inputs.</t>
            </li>
            <li>
              <t><strong>Non-Deterministic:</strong>
              </t>
              <ul spacing="normal">
                <li>
                  <t><strong><tt>ipcrypt-nd</tt> (KIASU-BC):</strong> Produces a 24-byte output using an 8-byte tweak; <tt>(input, tweak)</tt> collisions reveal repeated inputs (with the same tweak) but not their values. Expected collision after approximately 4 billion operations per key.</t>
                </li>
                <li>
                  <t><strong><tt>ipcrypt-ndx</tt> (AES-XTS):</strong> Produces a 32-byte output using a 16-byte tweak; supports higher secure operation counts per key. Expected collision after approximately 18 quintillion operations per key.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The ipcrypt constructions focus solely on confidentiality and do not provide integrity. This means that IP addresses in an ordered sequence can be partially removed, duplicated, reordered, or blindly altered by an active adversary. Applications that require sequences of encrypted IP addresses that cannot be modified must apply an authentication scheme over the entire sequence, such as an HMAC construction, a keyed hash function, or a public key signature. This is outside the scope of this specification, but implementers should be aware that additional authentication mechanisms are required if protection against active adversaries is needed.</t>
      <section anchor="deterministic-mode-security">
        <name>Deterministic Mode Security</name>
        <t>A permutation ensures distinct inputs yield distinct outputs. However, repeated inputs result in identical ciphertexts, thereby revealing repetition.</t>
        <t>This property makes deterministic encryption suitable for applications where format preservation is required, but linkability of repeated inputs is acceptable.</t>
      </section>
      <section anchor="non-deterministic-mode-security">
        <name>Non-Deterministic Mode Security</name>
        <t>The inclusion of a random tweak ensures that encrypting the same input generally produces different outputs. In cases where an <tt>(input, tweak)</tt> collision occurs, an attacker learns only that the same input was processed with that tweak, not the value of the input itself.</t>
        <t>Security is determined by the underlying block cipher (≈2^128 for AES-128) on a per-key basis. Key rotation is recommended to extend secure usage beyond the per-key collision bounds.</t>
      </section>
      <section anchor="implementation-security">
        <name>Implementation Security</name>
        <t>Implementations MUST ensure that:</t>
        <ol spacing="normal" type="1"><li>
            <t>Keys are generated using a cryptographically secure random number generator</t>
          </li>
          <li>
            <t>Tweak values are uniformly random for non-deterministic modes</t>
          </li>
          <li>
            <t>Side-channel attacks are mitigated through constant-time operations</t>
          </li>
          <li>
            <t>Error handling does not leak sensitive information</t>
          </li>
        </ol>
      </section>
      <section anchor="key-management-considerations">
        <name>Key Management Considerations</name>
        <t>This specification focuses on the cryptographic transformations and does not mandate specific key management practices. However, implementers MUST ensure:</t>
        <ol spacing="normal" type="1"><li>
            <t>Keys are generated using cryptographically secure random number generators (see <xref target="RFC4086"/>)</t>
          </li>
          <li>
            <t>Keys are stored securely and access-controlled appropriately for the deployment environment</t>
          </li>
          <li>
            <t>Key rotation policies are established based on usage volume and security requirements</t>
          </li>
          <li>
            <t>Key compromise procedures are defined and tested</t>
          </li>
        </ol>
        <t>For high-volume deployments processing billions of IP addresses, regular key rotation (e.g., monthly or quarterly) is RECOMMENDED to stay well within the security bounds discussed in this document.</t>
      </section>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t><em>This section is to be removed before publishing as an RFC.</em></t>
      <t>This section records the status of known implementations of the protocol defined by this specification at the time of posting of this Internet-Draft, and is based on a proposal described in <xref target="RFC7942"/>. The description of implementations in this section is intended to assist the Independent Submissions Editor in judging whether the specification is suitable for publication.</t>
      <t>Please note that the listing of any individual implementation here does not imply endorsement. Furthermore, no effort has been spent to verify the information presented here that was supplied by contributors. This is not intended as, and must not be construed to be, a catalog of available implementations or their features.</t>
      <t>Multiple interoperable implementations of the schemes described in this document have been developed:</t>
      <ul spacing="normal">
        <li>
          <t>C implementation</t>
        </li>
        <li>
          <t>D implementation</t>
        </li>
        <li>
          <t>Go implementation</t>
        </li>
        <li>
          <t>Java implementation (maven package)</t>
        </li>
        <li>
          <t>JavaScript/TypeScript implementation (npm package)</t>
        </li>
        <li>
          <t>PHP implementation (Composer package)</t>
        </li>
        <li>
          <t>Python reference implementation</t>
        </li>
        <li>
          <t>Rust implementation (cargo package)</t>
        </li>
        <li>
          <t>Zig implementation</t>
        </li>
        <li>
          <t>Dart implementation (pub.dev package)</t>
        </li>
      </ul>
      <t>A comprehensive list of implementations and their test results can be found at: https://ipcrypt-std.github.io/implementations/</t>
      <t>All implementations pass the common test vectors specified in this document, demonstrating interoperability across programming languages.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document does not require any IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="FIPS-197" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197.pdf">
          <front>
            <title>Advanced Encryption Standard (AES)</title>
            <author initials="" surname="NIST">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date year="2001" month="November" day="26"/>
          </front>
          <seriesInfo name="FIPS" value="PUB 197"/>
        </reference>
        <reference anchor="NIST-SP-800-38G" target="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38G.pdf">
          <front>
            <title>Recommendation for Block Cipher Modes of Operation: Methods for Format-Preserving Encryption</title>
            <author initials="" surname="NIST">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date year="2016" month="March"/>
          </front>
          <seriesInfo name="NIST" value="SP 800-38G"/>
        </reference>
        <reference anchor="IEEE-P1619" target="https://standards.ieee.org/ieee/1619/2041/">
          <front>
            <title>IEEE Standard for Cryptographic Protection of Data on Block-Oriented Storage Devices</title>
            <author initials="" surname="IEEE">
              <organization/>
            </author>
            <date year="2007" month="December" day="18"/>
          </front>
          <seriesInfo name="IEEE" value="1619-2007"/>
        </reference>
        <reference anchor="RFC6973">
          <front>
            <title>Privacy Considerations for Internet Protocols</title>
            <author fullname="A. Cooper" initials="A." surname="Cooper"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="B. Aboba" initials="B." surname="Aboba"/>
            <author fullname="J. Peterson" initials="J." surname="Peterson"/>
            <author fullname="J. Morris" initials="J." surname="Morris"/>
            <author fullname="M. Hansen" initials="M." surname="Hansen"/>
            <author fullname="R. Smith" initials="R." surname="Smith"/>
            <date month="July" year="2013"/>
            <abstract>
              <t>This document offers guidance for developing privacy considerations for inclusion in protocol specifications. It aims to make designers, implementers, and users of Internet protocols aware of privacy-related design choices. It suggests that whether any individual RFC warrants a specific privacy considerations section will depend on the document's content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6973"/>
          <seriesInfo name="DOI" value="10.17487/RFC6973"/>
        </reference>
        <reference anchor="RFC7258">
          <front>
            <title>Pervasive Monitoring Is an Attack</title>
            <author fullname="S. Farrell" initials="S." surname="Farrell"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="May" year="2014"/>
            <abstract>
              <t>Pervasive monitoring is a technical attack that should be mitigated in the design of IETF protocols, where possible.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="188"/>
          <seriesInfo name="RFC" value="7258"/>
          <seriesInfo name="DOI" value="10.17487/RFC7258"/>
        </reference>
        <reference anchor="RFC4086">
          <front>
            <title>Randomness Requirements for Security</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="J. Schiller" initials="J." surname="Schiller"/>
            <author fullname="S. Crocker" initials="S." surname="Crocker"/>
            <date month="June" year="2005"/>
            <abstract>
              <t>Security systems are built on strong cryptographic algorithms that foil pattern analysis attempts. However, the security of these systems is dependent on generating secret quantities for passwords, cryptographic keys, and similar quantities. The use of pseudo-random processes to generate secret quantities can result in pseudo-security. A sophisticated attacker may find it easier to reproduce the environment that produced the secret quantities and to search the resulting small set of possibilities than to locate the quantities in the whole of the potential number space.</t>
              <t>Choosing random quantities to foil a resourceful and motivated adversary is surprisingly difficult. This document points out many pitfalls in using poor entropy sources or traditional pseudo-random number generation techniques for generating such quantities. It recommends the use of truly random hardware techniques and shows that the existing hardware on many systems can be used for this purpose. It provides suggestions to ameliorate the problem when a hardware solution is not available, and it gives examples of how large such quantities need to be for some applications. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="106"/>
          <seriesInfo name="RFC" value="4086"/>
          <seriesInfo name="DOI" value="10.17487/RFC4086"/>
        </reference>
        <reference anchor="RFC7624">
          <front>
            <title>Confidentiality in the Face of Pervasive Surveillance: A Threat Model and Problem Statement</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="B. Schneier" initials="B." surname="Schneier"/>
            <author fullname="C. Jennings" initials="C." surname="Jennings"/>
            <author fullname="T. Hardie" initials="T." surname="Hardie"/>
            <author fullname="B. Trammell" initials="B." surname="Trammell"/>
            <author fullname="C. Huitema" initials="C." surname="Huitema"/>
            <author fullname="D. Borkmann" initials="D." surname="Borkmann"/>
            <date month="August" year="2015"/>
            <abstract>
              <t>Since the initial revelations of pervasive surveillance in 2013, several classes of attacks on Internet communications have been discovered. In this document, we develop a threat model that describes these attacks on Internet confidentiality. We assume an attacker that is interested in undetected, indiscriminate eavesdropping. The threat model is based on published, verified attacks.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7624"/>
          <seriesInfo name="DOI" value="10.17487/RFC7624"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC4291">
          <front>
            <title>IP Version 6 Addressing Architecture</title>
            <author fullname="R. Hinden" initials="R." surname="Hinden"/>
            <author fullname="S. Deering" initials="S." surname="Deering"/>
            <date month="February" year="2006"/>
            <abstract>
              <t>This specification defines the addressing architecture of the IP Version 6 (IPv6) protocol. The document includes the IPv6 addressing model, text representations of IPv6 addresses, definition of IPv6 unicast addresses, anycast addresses, and multicast addresses, and an IPv6 node's required addresses.</t>
              <t>This document obsoletes RFC 3513, "IP Version 6 Addressing Architecture". [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4291"/>
          <seriesInfo name="DOI" value="10.17487/RFC4291"/>
        </reference>
        <reference anchor="RFC7942">
          <front>
            <title>Improving Awareness of Running Code: The Implementation Status Section</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <date month="July" year="2016"/>
            <abstract>
              <t>This document describes a simple process that allows authors of Internet-Drafts to record the status of known implementations by including an Implementation Status section. This will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.</t>
              <t>This process is not mandatory. Authors of Internet-Drafts are encouraged to consider using the process for their documents, and working groups are invited to think about applying the process to all of their protocol specifications. This document obsoletes RFC 6982, advancing it to a Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="205"/>
          <seriesInfo name="RFC" value="7942"/>
          <seriesInfo name="DOI" value="10.17487/RFC7942"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="DEOXYS-BC" target="https://eprint.iacr.org/2014/427">
          <front>
            <title>Deoxys-BC: A Highly Secure Tweakable Block Cipher</title>
            <author initials="J." surname="Jean">
              <organization/>
            </author>
            <author initials="I." surname="Nikolić">
              <organization/>
            </author>
            <author initials="T." surname="Peyrin">
              <organization/>
            </author>
            <date year="2014"/>
          </front>
          <seriesInfo name="Cryptology ePrint Archive" value="Paper 2014/427"/>
        </reference>
        <reference anchor="SKINNY" target="https://eprint.iacr.org/2016/660">
          <front>
            <title>The SKINNY Family of Block Ciphers and its Low-Latency Variant MANTIS</title>
            <author initials="C." surname="Beierle">
              <organization/>
            </author>
            <author initials="A." surname="Biryukov">
              <organization/>
            </author>
            <author initials="L." surname="Perrin">
              <organization/>
            </author>
            <author initials="A." surname="Udovenko">
              <organization/>
            </author>
            <author initials="V." surname="Velichkov">
              <organization/>
            </author>
            <author initials="Q." surname="Wang">
              <organization/>
            </author>
            <date year="2016"/>
          </front>
          <seriesInfo name="CRYPTO" value="2016"/>
        </reference>
        <reference anchor="LRW2002" target="https://www.cs.berkeley.edu/~daw/papers/tweak-crypto02.pdf">
          <front>
            <title>Tweakable Block Ciphers</title>
            <author initials="M." surname="Liskov">
              <organization/>
            </author>
            <author initials="R." surname="Rivest">
              <organization/>
            </author>
            <author initials="D." surname="Wagner">
              <organization/>
            </author>
            <date year="2002"/>
          </front>
          <seriesInfo name="Fast Software Encryption" value="2002"/>
        </reference>
        <reference anchor="BRW2005" target="https://www.cs.ucdavis.edu/~rogaway/papers/subset.pdf">
          <front>
            <title>Format-Preserving Encryption</title>
            <author initials="M." surname="Bellare">
              <organization/>
            </author>
            <author initials="P." surname="Rogaway">
              <organization/>
            </author>
            <author initials="D." surname="Wagner">
              <organization/>
            </author>
            <date year="2005"/>
          </front>
          <seriesInfo name="CRYPTO" value="2005"/>
        </reference>
        <reference anchor="KIASU-BC" target="https://eprint.iacr.org/2014/831">
          <front>
            <title>Tweaks and Keys for Block Ciphers: the TWEAKEY Framework</title>
            <author initials="J." surname="Jean">
              <organization/>
            </author>
            <author initials="I." surname="Nikolić">
              <organization/>
            </author>
            <author initials="T." surname="Peyrin">
              <organization/>
            </author>
            <date year="2014"/>
          </front>
          <seriesInfo name="Cryptology ePrint Archive" value="Paper 2014/831"/>
        </reference>
        <reference anchor="XTS-AES">
          <front>
            <title>The XTS-AES Mode for Disk Encryption</title>
            <author initials="J." surname="Black">
              <organization/>
            </author>
            <author initials="E." surname="Dawson">
              <organization/>
            </author>
            <author initials="S." surname="Gueron">
              <organization/>
            </author>
            <author initials="P." surname="Rogaway">
              <organization/>
            </author>
            <date year="2010"/>
          </front>
          <seriesInfo name="IEEE" value="1619-2007"/>
        </reference>
        <reference anchor="IPCRYPT2" target="https://github.com/jedisct1/ipcrypt2">
          <front>
            <title>ipcrypt2: IP address encryption/obfuscation tool</title>
            <author initials="F." surname="Denis">
              <organization/>
            </author>
            <date year="2025"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 422?>

<section anchor="diagrams">
      <name>Diagrams</name>
      <t>This appendix provides visual representations of the key operations described in this document. For implementation details, see <xref target="pseudocode-and-examples"/>.</t>
      <section anchor="ipv4-address-conversion-diagram">
        <name>IPv4 Address Conversion Diagram</name>
        <artwork><![CDATA[
       IPv4: 192.0.2.1
           |
           v
  Octets:  C0  00  02  01
           |
           v
   16-Byte Array:
[00 00 00 00 00 00 00 00 00 00 | FF FF | C0 00 02 01]
]]></artwork>
      </section>
      <section anchor="deterministic-encryption-flow">
        <name>Deterministic Encryption Flow</name>
        <artwork><![CDATA[
            IP Address
                |
                v
       [Convert to 16 Bytes]
                |
                v
    [AES-128 Single-Block Encrypt]
                |
                v
       16-Byte Ciphertext
                |
                v
     [Convert to IP Format]
                |
                v
       Encrypted IP Address
]]></artwork>
      </section>
      <section anchor="nondeterministic-encryption-flow-ipcrypt-nd">
        <name>Non‑Deterministic Encryption Flow (ipcrypt-nd)</name>
        <artwork><![CDATA[
              IP Address
                  |
                  v
       [Convert to 16 Bytes]
                  |
                  v
    [Generate Random 8-Byte Tweak]
                  |
                  v
       [KIASU-BC Tweakable Encrypt]
                  |
                  v
          16-Byte Ciphertext
                  |
                  v
    [Concatenate Tweak || Ciphertext]
                  |
                  v
       24-Byte Output (ipcrypt-nd)
]]></artwork>
      </section>
      <section anchor="nondeterministic-encryption-flow-ipcrypt-ndx">
        <name>Non‑Deterministic Encryption Flow (ipcrypt-ndx)</name>
        <artwork><![CDATA[
              IP Address
                  |
                  v
       [Convert to 16 Bytes]
                  |
                  v
    [Generate Random 16-Byte Tweak]
                  |
                  v
       [AES-XTS Tweakable Encrypt]
                  |
                  v
          16-Byte Ciphertext
                  |
                  v
    [Concatenate Tweak || Ciphertext]
                  |
                  v
       32-Byte Output (ipcrypt-ndx)
]]></artwork>
      </section>
    </section>
    <section anchor="pseudocode-and-examples">
      <name>Pseudocode and Examples</name>
      <t>This appendix provides detailed pseudocode for key operations described in this document. For a visual representation of these operations, see <xref target="diagrams"/>.</t>
      <section anchor="ipv4-address-conversion">
        <name>IPv4 Address Conversion</name>
        <t>For a diagram of this conversion process, see <xref target="ipv4-address-conversion-diagram"/>.</t>
        <sourcecode type="pseudocode"><![CDATA[
function IPv4To16Bytes(ipv4_address):
    // Split the IPv4 address into its octets
    parts = ipv4_address.split(".")
    if length(parts) != 4:
         raise Error("Invalid IPv4 address")
    // Create a 16-byte array with the IPv4-mapped prefix
    bytes16 = [0x00] * 10         // 10 bytes of 0x00
    bytes16.append(0xFF)          // 11th byte: 0xFF
    bytes16.append(0xFF)          // 12th byte: 0xFF
    // Append each octet (converted to an 8-bit integer)
    for part in parts:
         bytes16.append(int(part))
    return bytes16
]]></sourcecode>
        <t><em>Example:</em> For <tt>"192.0.2.1"</tt>, the function returns</t>
        <artwork><![CDATA[
[00, 00, 00, 00, 00, 00, 00, 00, 00, 00, FF, FF, C0, 00, 02, 01]
]]></artwork>
      </section>
      <section anchor="ipv6-address-conversion">
        <name>IPv6 Address Conversion</name>
        <sourcecode type="pseudocode"><![CDATA[
function IPv6To16Bytes(ipv6_address):
    // Parse the IPv6 address into eight 16-bit words.
    words = parseIPv6(ipv6_address)  // Expands shorthand notation and returns 8 words
    bytes16 = []
    for word in words:
         high_byte = (word >> 8) & 0xFF
         low_byte = word & 0xFF
         bytes16.append(high_byte)
         bytes16.append(low_byte)
    return bytes16
]]></sourcecode>
        <t><em>Example:</em> For <tt>"2001:0db8:85a3:0000:0000:8a2e:0370:7334"</tt>, the output is the corresponding 16‑byte sequence.</t>
      </section>
      <section anchor="conversion-from-a-16-byte-array-to-an-ip-address">
        <name>Conversion from a 16-Byte Array to an IP Address</name>
        <sourcecode type="pseudocode"><![CDATA[
function Bytes16ToIP(bytes16):
    if length(bytes16) != 16:
         raise Error("Invalid byte array")

    // Check for the IPv4-mapped prefix
    if bytes16[0:10] == [0x00]*10 and bytes16[10] == 0xFF and bytes16[11] == 0xFF:
         ipv4_parts = []
         for i from 12 to 15:
             ipv4_parts.append(str(bytes16[i]))
         ipv4_address = join(ipv4_parts, ".")
         return ipv4_address
    else:
         words = []
         for i from 0 to 15 step 2:
             word = (bytes16[i] << 8) | bytes16[i+1]
             words.append(format(word, "x"))
         ipv6_address = join(words, ":")
         return ipv6_address
]]></sourcecode>
      </section>
      <section anchor="deterministic-encryption-ipcrypt-deterministic">
        <name>Deterministic Encryption (ipcrypt-deterministic)</name>
        <sourcecode type="pseudocode"><![CDATA[
function ipcrypt_deterministic_encrypt(ip_address, key):
    // The key MUST be exactly 16 bytes (128 bits) in length
    if length(key) != 16:
        raise Error("Key must be 16 bytes")

    bytes16 = convertTo16Bytes(ip_address)
    ciphertext = AES128_encrypt(key, bytes16)
    encrypted_ip = Bytes16ToIP(ciphertext)
    return encrypted_ip

function ipcrypt_deterministic_decrypt(encrypted_ip, key):
    if length(key) != 16:
        raise Error("Key must be 16 bytes")

    bytes16 = convertTo16Bytes(encrypted_ip)
    plaintext = AES128_decrypt(key, bytes16)
    original_ip = Bytes16ToIP(plaintext)
    return original_ip
]]></sourcecode>
      </section>
      <section anchor="non-deterministic-encryption-using-kiasu-bc-ipcrypt-nd">
        <name>Non-Deterministic Encryption using KIASU-BC (ipcrypt-nd)</name>
        <sourcecode type="pseudocode"><![CDATA[
function ipcrypt_nd_encrypt(ip_address, key):
    if length(key) != 16:
        raise Error("Key must be 16 bytes")

    // Step 1: Generate random tweak (8 bytes)
    tweak = random_bytes(8)  // MUST be uniformly random

    // Step 2: Convert IP to 16-byte representation
    bytes16 = convertTo16Bytes(ip_address)

    // Step 3: Encrypt using key and tweak
    ciphertext = KIASU_BC_encrypt(key, tweak, bytes16)

    // Step 4: Concatenate tweak and ciphertext
    result = concatenate(tweak, ciphertext)  // 8 bytes || 16 bytes = 24 bytes total
    return result

function ipcrypt_nd_decrypt(ciphertext, key):
    // Step 1: Split ciphertext into tweak and encrypted IP
    tweak = ciphertext[0:8]  // First 8 bytes
    encrypted_ip = ciphertext[8:24]  // Remaining 16 bytes

    // Step 2: Decrypt using key and tweak
    bytes16 = KIASU_BC_decrypt(key, tweak, encrypted_ip)

    // Step 3: Convert back to IP address
    ip_address = Bytes16ToIP(bytes16)
    return ip_address
]]></sourcecode>
      </section>
      <section anchor="non-deterministic-encryption-using-aes-xts-ipcrypt-ndx">
        <name>Non-Deterministic Encryption using AES-XTS (ipcrypt-ndx)</name>
        <sourcecode type="pseudocode"><![CDATA[
function AES_XTS_encrypt(key, tweak, block):
    // Split the key into two halves
    K1, K2 = split_key(key)

    // Encrypt the tweak with the second half of the key
    ET = AES128_encrypt(K2, tweak)

    // Encrypt the block: AES128(block ⊕ ET, K1) ⊕ ET
    return AES128_encrypt(K1, block ⊕ ET) ⊕ ET
]]></sourcecode>
        <sourcecode type="pseudocode"><![CDATA[
function ipcrypt_ndx_encrypt(ip_address, key):
    if length(key) != 32:
        raise Error("Key must be 32 bytes (two AES-128 keys)")

    // Step 1: Generate random tweak (16 bytes)
    tweak = random_bytes(16)  // MUST be uniformly random

    // Step 2: Convert IP to 16-byte representation
    bytes16 = convertTo16Bytes(ip_address)

    // Step 3: Encrypt using key and tweak
    ciphertext = AES_XTS_encrypt(key, tweak, bytes16)

    // Step 4: Concatenate tweak and ciphertext
    result = concatenate(tweak, ciphertext)  // 16 bytes || 16 bytes = 32 bytes total
    return result

function ipcrypt_ndx_decrypt(ciphertext, key):
    // Step 1: Split ciphertext into tweak and encrypted IP
    tweak = ciphertext[0:16]  // First 16 bytes
    encrypted_ip = ciphertext[16:32]  // Remaining 16 bytes

    // Step 2: Decrypt using key and tweak
    bytes16 = AES_XTS_decrypt(key, tweak, encrypted_ip)

    // Step 3: Convert back to IP address
    ip_address = Bytes16ToIP(bytes16)
    return ip_address
]]></sourcecode>
      </section>
    </section>
    <section anchor="implementing-kiasu-bc">
      <name>Implementing KIASU-BC</name>
      <t>This appendix provides a detailed guide for implementing the KIASU-BC tweakable block cipher. KIASU-BC is based on AES-128 with modifications to incorporate a tweak.</t>
      <section anchor="overview">
        <name>Overview</name>
        <t>KIASU-BC extends AES-128 by incorporating an 8-byte tweak into each round. The tweak is padded to 16 bytes and XORed with the round key at each round of the cipher. This construction is used in the <tt>ipcrypt-nd</tt> instantiation.</t>
      </section>
      <section anchor="tweak-padding">
        <name>Tweak Padding</name>
        <t>The 8-byte tweak is padded to 16 bytes using the following method:</t>
        <ol spacing="normal" type="1"><li>
            <t>Split the 8-byte tweak into four 2-byte pairs</t>
          </li>
          <li>
            <t>Place each 2-byte pair at the start of each 4-byte group</t>
          </li>
          <li>
            <t>Fill the remaining 2 bytes of each group with zeros</t>
          </li>
        </ol>
        <t>Example:</t>
        <artwork><![CDATA[
8-byte tweak:    [T0 T1 T2 T3 T4 T5 T6 T7]
16-byte padded:  [T0 T1 00 00 T2 T3 00 00 T4 T5 00 00 T6 T7 00 00]
]]></artwork>
      </section>
      <section anchor="round-structure">
        <name>Round Structure</name>
        <t>Each round of KIASU-BC consists of the following standard AES operations:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>SubBytes:</strong> Apply the AES S-box to each byte of the state</t>
          </li>
          <li>
            <t><strong>ShiftRows:</strong> Rotate each row of the state matrix</t>
          </li>
          <li>
            <t><strong>MixColumns:</strong> Mix the columns of the state matrix (except in the final round)</t>
          </li>
          <li>
            <t><strong>AddRoundKey:</strong> XOR the state with the round key and padded tweak</t>
          </li>
        </ol>
        <t>For details about these operations, see <xref target="FIPS-197"/>.</t>
      </section>
      <section anchor="key-schedule">
        <name>Key Schedule</name>
        <t>The key schedule follows the standard AES-128 key expansion:</t>
        <ol spacing="normal" type="1"><li>
            <t>The initial key is expanded into 11 round keys</t>
          </li>
          <li>
            <t>Each round key is XORed with the padded tweak before use</t>
          </li>
          <li>
            <t>The first round key is used in the initial AddRoundKey operation</t>
          </li>
        </ol>
      </section>
      <section anchor="implementation-steps">
        <name>Implementation Steps</name>
        <ol spacing="normal" type="1"><li>
            <t><strong>Key Expansion:</strong>
            </t>
            <ul spacing="normal">
              <li>
                <t>Expand the 16-byte key into 11 round keys using the standard AES key schedule</t>
              </li>
              <li>
                <t>Each round key is 16 bytes</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Tweak Processing:</strong>
            </t>
            <ul spacing="normal">
              <li>
                <t>Pad the 8-byte tweak to 16 bytes as described above</t>
              </li>
              <li>
                <t>XOR the padded tweak with each round key before use</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Encryption Process:</strong>
            </t>
            <ul spacing="normal">
              <li>
                <t>Perform initial AddRoundKey with the first tweaked round key</t>
              </li>
              <li>
                <t>For rounds 1-9:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>SubBytes</t>
                  </li>
                  <li>
                    <t>ShiftRows</t>
                  </li>
                  <li>
                    <t>MixColumns</t>
                  </li>
                  <li>
                    <t>AddRoundKey (with tweaked round key)</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>For round 10 (final round):
                </t>
                <ul spacing="normal">
                  <li>
                    <t>SubBytes</t>
                  </li>
                  <li>
                    <t>ShiftRows</t>
                  </li>
                  <li>
                    <t>AddRoundKey (with tweaked round key)</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
        </ol>
      </section>
      <section anchor="example-implementation">
        <name>Example Implementation</name>
        <t>The following pseudocode illustrates the core operations of KIASU-BC:</t>
        <sourcecode type="pseudocode"><![CDATA[
function pad_tweak(tweak):
    // Input: 8-byte tweak
    // Output: 16-byte padded tweak
    padded = [0] * 16
    for i in range(0, 8, 2):
        padded[i*2] = tweak[i]
        padded[i*2+1] = tweak[i+1]
    return padded

function kiasu_bc_encrypt(key, tweak, plaintext):
    // Input: 16-byte key, 8-byte tweak, 16-byte plaintext
    // Output: 16-byte ciphertext

    // Expand key and pad tweak
    round_keys = expand_key(key)
    padded_tweak = pad_tweak(tweak)

    // Initial round
    state = plaintext
    state = add_round_key(state, round_keys[0] ^ padded_tweak)

    // Main rounds
    for round in range(1, 10):
        state = sub_bytes(state)
        state = shift_rows(state)
        state = mix_columns(state)
        state = add_round_key(state, round_keys[round] ^ padded_tweak)

    // Final round
    state = sub_bytes(state)
    state = shift_rows(state)
    state = add_round_key(state, round_keys[10] ^ padded_tweak)

    return state
]]></sourcecode>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This appendix provides test vectors for all three variants of ipcrypt. Each test vector includes the key, input IP address, and encrypted output. For non-deterministic variants (<tt>ipcrypt-nd</tt> and <tt>ipcrypt-ndx</tt>), the tweak value is also included.</t>
      <t>Key and tweak sizes for each variant:
- <tt>ipcrypt-deterministic</tt>: Key: 16 bytes (128 bits), no tweak
- <tt>ipcrypt-nd</tt>: Key: 16 bytes (128 bits), Tweak: 8 bytes (64 bits)
- <tt>ipcrypt-ndx</tt>: Key: 32 bytes (256 bits, two AES-128 keys), Tweak: 16 bytes (128 bits)</t>
      <section anchor="ipcrypt-deterministic-test-vectors">
        <name>ipcrypt-deterministic Test Vectors</name>
        <artwork><![CDATA[
# Test vector 1
Key:          0123456789abcdeffedcba9876543210
Input IP:     0.0.0.0
Encrypted IP: bde9:6789:d353:824c:d7c6:f58a:6bd2:26eb

# Test vector 2
Key:          1032547698badcfeefcdab8967452301
Input IP:     255.255.255.255
Encrypted IP: aed2:92f6:ea23:58c3:48fd:8b8:74e8:45d8

# Test vector 3
Key:          2b7e151628aed2a6abf7158809cf4f3c
Input IP:     192.0.2.1
Encrypted IP: 1dbd:c1b9:fff1:7586:7d0b:67b4:e76e:4777
]]></artwork>
      </section>
      <section anchor="ipcrypt-nd-test-vectors">
        <name>ipcrypt-nd Test Vectors</name>
        <artwork><![CDATA[
# Test vector 1
Key:          0123456789abcdeffedcba9876543210
Input IP:     0.0.0.0
Tweak:        08e0c289bff23b7c
Output:       08e0c289bff23b7cb349aadfe3bcef56221c384c7c217b16

# Test vector 2
Key:          1032547698badcfeefcdab8967452301
Input IP:     192.0.2.1
Tweak:        21bd1834bc088cd2
Output:       21bd1834bc088cd2e5e1fe55f95876e639faae2594a0caad

# Test vector 3
Key:          2b7e151628aed2a6abf7158809cf4f3c
Input IP:     2001:db8::1
Tweak:        b4ecbe30b70898d7
Output:       b4ecbe30b70898d7553ac8974d1b4250eafc4b0aa1f80c96
]]></artwork>
      </section>
      <section anchor="ipcrypt-ndx-test-vectors">
        <name>ipcrypt-ndx Test Vectors</name>
        <artwork><![CDATA[
# Test vector 1
Key:          0123456789abcdeffedcba98765432101032547698badcfeefcdab8967452301
Input IP:     0.0.0.0
Tweak:        21bd1834bc088cd2b4ecbe30b70898d7
Output:       21bd1834bc088cd2b4ecbe30b70898d782db0d4125fdace61db35b8339f20ee5

# Test vector 2
Key:          1032547698badcfeefcdab89674523010123456789abcdeffedcba9876543210
Input IP:     192.0.2.1
Tweak:        08e0c289bff23b7cb4ecbe30b70898d7
Output:       08e0c289bff23b7cb4ecbe30b70898d7766a533392a69edf1ad0d3ce362ba98a

# Test vector 3
Key:          2b7e151628aed2a6abf7158809cf4f3c3c4fcf098815f7aba6d2ae2816157e2b
Input IP:     2001:db8::1
Tweak:        21bd1834bc088cd2b4ecbe30b70898d7
Output:       21bd1834bc088cd2b4ecbe30b70898d76089c7e05ae30c2d10ca149870a263e4
]]></artwork>
        <t>For non-deterministic variants (<tt>ipcrypt-nd</tt> and <tt>ipcrypt-ndx</tt>), the tweak values shown are examples. In practice, tweaks MUST be randomly generated for each encryption operation.</t>
        <t>Implementations SHOULD verify their correctness against these test vectors before deployment.</t>
      </section>
    </section>
    <section anchor="alternatives-to-random-tweaks">
      <name>Alternatives to Random Tweaks</name>
      <t>While this specification recommends the use of uniformly random tweaks for non-deterministic encryption, implementers may consider alternative approaches:</t>
      <ul spacing="normal">
        <li>
          <t><strong>Monotonic Counter:</strong> A counter could be used as a tweak, but this is difficult to maintain in distributed systems. If the counter is not encrypted and the tweakable block cipher is not secure against related-tweak attacks, this could enable correlation attacks.</t>
        </li>
        <li>
          <t><strong>UUIDs:</strong> UUIDs (such as UUIDv6 or UUIDv7) could be used as tweaks; however, these would reveal the original timestamp of the logged IP addresses, which may not be desirable from a privacy perspective.</t>
        </li>
      </ul>
      <t>Although the birthday bound is a concern with random tweaks, the use of random tweaks remains the recommended and most practical approach, offering the best tradeoffs for most real-world use cases.</t>
    </section>
    <section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author gratefully acknowledges the contributions and insightful comments from members of the IETF independent stream community and the broader cryptographic community that have helped shape this specification.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
SxR0G/8H/DvnzoSMAAA=

-->

</rfc>
