<?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-10" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.1 -->
  <front>
    <title abbrev="ipcrypt">Methods for IP Address Encryption and Obfuscation</title>
    <seriesInfo name="Internet-Draft" value="draft-denis-ipcrypt-10"/>
    <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 153?>

<t>IP addresses are personally identifiable information that requires protection, yet common techniques such as truncation destroy data irreversibly while providing inconsistent privacy guarantees, and ad-hoc encryption schemes often lack interoperability and security analysis.</t>
      <t>This document specifies secure, efficient methods for encrypting IP addresses for privacy-preserving storage, logging, and analytics, addressing data minimization concerns raised in <xref target="RFC6973"/>.</t>
      <t>Four concrete instantiations are defined: <tt>ipcrypt-deterministic</tt> provides deterministic, format-preserving encryption with 16-byte outputs; <tt>ipcrypt-pfx</tt> provides deterministic, prefix-preserving encryption that maintains network relationships with native address sizes (4 bytes for IPv4, 16 bytes for IPv6); while <tt>ipcrypt-nd</tt> and <tt>ipcrypt-ndx</tt> introduce randomness to prevent correlation. All methods are reversible with the encryption key and designed for high-performance processing at network speeds.</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 161?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>IP addresses are personally identifiable information requiring protection, yet common anonymization approaches have fundamental limitations. Truncation (zeroing parts of addresses) irreversibly destroys data while providing variable privacy levels; A /24 mask may obscure one user or thousands depending on network allocation. Hashing produces non-reversible outputs unsuitable for operational tasks such as abuse investigation. Ad-hoc encryption schemes often lack rigorous security analysis and have limited interoperability.</t>
      <t>This document addresses these deficiencies by specifying secure, efficient, and interoperable methods for IP address encryption and obfuscation.</t>
      <t>This specification addresses concerns raised in <xref target="RFC7624"/> regarding confidentiality when sharing data with third parties. Unlike existing practices that obscure addresses, these methods provide mathematically provable security properties, which are discussed throughout this document and summarized in <xref target="security-considerations"/>.</t>
      <section anchor="use-cases-and-motivations">
        <name>Use Cases and Motivations</name>
        <t>Organizations handling IP addresses require mechanisms to protect user privacy while maintaining operational capabilities. Generic encryption systems expand data unpredictably, lack compatibility with network tools, and are not designed for high-volume processing. The specialized methods in this specification address these requirements:</t>
        <ul spacing="normal">
          <li>
            <t>Efficiency and Compactness: All variants operate on 128 bits, achieving single-block encryption speed required for network-rate processing. Non-deterministic variants add only 8-16 bytes of tweak overhead.</t>
          </li>
          <li>
            <t>High Usage Limits: Non-deterministic variants safely handle massive volumes: approximately 4 billion operations for <tt>ipcrypt-nd</tt> and 18 quintillion for <tt>ipcrypt-ndx</tt> per key, without degrading security. Generic encryption often requires complex key rotation schemes at lower thresholds.</t>
          </li>
          <li>
            <t>Format Preservation: The <tt>ipcrypt-deterministic</tt> and <tt>ipcrypt-pfx</tt> variants produce valid IP addresses rather than arbitrary ciphertext, enabling encrypted addresses to pass through existing network infrastructure, monitoring tools, and databases without modification. The <tt>ipcrypt-pfx</tt> variant uniquely preserves network prefix relationships while maintaining the original address type and size, enabling network-level analytics while protecting individual address identity (see <xref target="format-preservation-and-limitations"/>).</t>
          </li>
          <li>
            <t>Interoperability: All conforming implementations produce identical results, enabling data exchange between different systems, vendors, and programming languages.</t>
          </li>
        </ul>
        <t>These specialized encryption methods enable several use cases:</t>
        <ul spacing="normal">
          <li>
            <t>Privacy Protection: Prevents exposure of sensitive user information to third parties in logs, analytics data, and network measurements (<xref target="RFC6973"/>). The key holder retains decryption capability.</t>
          </li>
          <li>
            <t>Correlation Attack Resistance: Non-deterministic variants leverage random tweaks to hide patterns and enhance confidentiality (see <xref target="non-deterministic-encryption"/>).</t>
          </li>
          <li>
            <t>Privacy-Preserving Analytics: Encrypted IP addresses can be used directly for counting unique clients, rate limiting, or deduplication without revealing original values. This addresses the anonymization requirements for DNS query data sharing outlined in <xref target="RSSAC040"/>. The <tt>ipcrypt-pfx</tt> variant preserves network prefixes for network-level analytics, while other methods scramble network hierarchy.</t>
          </li>
          <li>
            <t>Third-Party Integration: Encrypted IP addresses can serve as privacy-preserving identifiers when interacting with untrusted services, cloud providers, or external platforms.</t>
          </li>
        </ul>
        <t>The following examples demonstrate how the same IP addresses transform under each method:</t>
        <ul spacing="normal">
          <li>
            <t>Format-preserving: Valid IP addresses, same input always produces same output:</t>
          </li>
        </ul>
        <artwork><![CDATA[
192.168.1.1   -> d1e9:518:d5bc:4487:51c6:c51f:44ed:e9f6
192.168.1.254 -> fd7e:f70f:44d7:cdb2:2992:95a1:e692:7696
192.168.1.254 -> fd7e:f70f:44d7:cdb2:2992:95a1:e692:7696  # Same output
]]></artwork>
        <ul spacing="normal">
          <li>
            <t>Prefix-preserving: Maintains network structure, same prefix when IPs share prefix:</t>
          </li>
        </ul>
        <artwork><![CDATA[
192.168.1.1   -> 251.81.131.124
192.168.1.254 -> 251.81.131.159       # Prefix is preserved
172.16.69.42  -> 165.228.146.177
]]></artwork>
        <ul spacing="normal">
          <li>
            <t>Non-deterministic: Larger output, different each time:</t>
          </li>
        </ul>
        <artwork><![CDATA[
192.168.1.1   -> f0ea0bbd...03aa9fcb
192.168.1.254 -> 620b58d8...2ff8086f
192.168.1.254 -> 35fc2338...25abed5d  # Same input, different outputs
]]></artwork>
        <t>For implementation guidelines, see <xref target="implementation-details"/>.</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 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 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>IP Address: An IPv4 or IPv6 address as defined in <xref target="RFC4291"/>.</t>
        </li>
        <li>
          <t>IPv4-mapped IPv6 Address: An IPv6 address format (::ffff:a.b.c.d) used to represent IPv4 addresses within the IPv6 address space, enabling uniform processing of both address types.</t>
        </li>
        <li>
          <t>16-Byte Representation: A fixed-length representation used for both IPv4 (via IPv4-mapped IPv6) and IPv6 addresses.</t>
        </li>
        <li>
          <t>Block Cipher: A deterministic cryptographic algorithm that encrypts fixed-size blocks of data (128 bits in this specification) using a secret key.</t>
        </li>
        <li>
          <t>Permutation: A bijective function where each distinct input maps to a unique output, ensuring reversibility.</t>
        </li>
        <li>
          <t>Pseudorandom Function (PRF): A deterministic function that produces output computationally indistinguishable from truly random values.</t>
        </li>
        <li>
          <t>Tweakable Block Cipher (TBC): A block cipher that accepts an additional non-secret parameter (tweak) along with the key and plaintext, allowing domain separation without changing keys.</t>
        </li>
        <li>
          <t>Tweak: A non-secret, additional input to a tweakable block cipher that further randomizes the output.</t>
        </li>
        <li>
          <t>Deterministic Encryption: Encryption that always produces the same ciphertext for a given input and key.</t>
        </li>
        <li>
          <t>Non-Deterministic Encryption: Encryption that produces different ciphertexts for the same input due to the inclusion of a randomly sampled tweak.</t>
        </li>
        <li>
          <t>Prefix-Preserving Encryption: An encryption mode where IP addresses from the same network produce ciphertexts that share a common encrypted prefix, maintaining network relationships while obscuring actual network identities.</t>
        </li>
        <li>
          <t>Birthday Bound: The point at which collisions become statistically likely in a random sampling process, approximately 2<sup>(n/2)</sup> operations for n-bit values.</t>
        </li>
        <li>
          <t>(Input, Tweak) Collision: 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 used by <tt>ipcrypt-deterministic</tt>, <tt>ipcrypt-nd</tt>, and <tt>ipcrypt-ndx</tt>. The <tt>ipcrypt-pfx</tt> method differs by maintaining native address sizes—4 bytes for IPv4 and 16 bytes for IPv6—to preserve network structure (see <xref target="prefix-preserving-encryption"/>).</t>
      <section anchor="converting-to-a-16-byte-representation">
        <name>Converting to a 16-Byte Representation</name>
        <section anchor="ipv6-addresses">
          <name>IPv6 Addresses</name>
          <t>IPv6 addresses (128 bits) are converted directly using network byte order 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>Conversion algorithm:</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>128-bit Block Cipher Construction:
          </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>128-bit Tweakable Block Cipher (TBC) Construction:
          </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>SKINNY (see <xref target="SKINNY"/>)</t>
        </li>
        <li>
          <t>DEOXYS-BC (see <xref target="DEOXYS-BC"/>)</t>
        </li>
        <li>
          <t>KIASU-BC (see <xref target="implementing-kiasu-bc"/> for implementation details)</t>
        </li>
        <li>
          <t>AES-XTS (see <xref target="ipcrypt-ndx"/> for usage)</t>
        </li>
      </ul>
      <t>Implementers MUST choose a cipher that 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, producing the same ciphertext for the same input and key.</t>
      <t>Deterministic encryption is appropriate when:</t>
      <ul spacing="normal">
        <li>
          <t>Duplicate IP addresses need to be detected in encrypted form (e.g., for rate limiting)</t>
        </li>
        <li>
          <t>Storage space is critical (produces only 16 bytes output)</t>
        </li>
        <li>
          <t>Format preservation is required (output remains a valid IP address)</t>
        </li>
        <li>
          <t>Correlation of the same address across records is acceptable</t>
        </li>
      </ul>
      <t>All instantiations (<tt>ipcrypt-deterministic</tt>, <tt>ipcrypt-pfx</tt>, <tt>ipcrypt-nd</tt>, and <tt>ipcrypt-ndx</tt>) are invertible. For non-deterministic modes, the tweak must be preserved along with the ciphertext to enable decryption.</t>
      <t>Implementation details are provided in <xref target="implementation-details"/>.</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 16 bytes (128 bits). As AES-128 is a permutation, each distinct input maps to a unique ciphertext, preserving the IP address format.</t>
        <t>Test vectors are provided in <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-and-limitations">
        <name>Format Preservation and Limitations</name>
        <section anchor="network-hierarchy-preservation">
          <name>Network Hierarchy Preservation</name>
          <t>Most encryption methods in this specification scramble network hierarchy, with the notable exception of <tt>ipcrypt-pfx</tt>:</t>
          <ul spacing="normal">
            <li>
              <t><tt>ipcrypt-deterministic</tt>, <tt>ipcrypt-nd</tt>, and <tt>ipcrypt-ndx</tt>: These methods completely scramble IPv4 and IPv6 prefixes in the encrypted output. Addresses from the same subnet appear unrelated after encryption, and geographic or topological proximity cannot be inferred.</t>
            </li>
            <li>
              <t><tt>ipcrypt-pfx</tt>: This method preserves network prefix relationships in the encrypted output. Addresses from the same subnet share a common encrypted prefix, enabling network-level analytics while protecting the actual network identity. The encrypted prefixes themselves are cryptographically transformed and unrecognizable without the key.</t>
            </li>
          </ul>
        </section>
        <section anchor="format-preservation-without-prefix-preservation">
          <name>Format Preservation Without Prefix Preservation</name>
          <t>For methods other than <tt>ipcrypt-pfx</tt>, IPv4 addresses are typically encrypted as IPv6 addresses.</t>
          <t>IPv4 format preservation without prefix preservation (maintaining IPv4 addresses as IPv4 in deterministic or non-deterministic modes) is not specified in this document and is generally discouraged due to the limited 32-bit address space, which significantly reduces encryption security.</t>
          <t>If IPv4 format preservation is absolutely required despite the security limitations, implementers SHOULD implement a Format-Preserving Encryption (FPE) mode such as the FF1 algorithm specified in <xref target="NIST-SP-800-38G"/> or FAST <xref target="FAST"/>.</t>
        </section>
        <section anchor="preserving-metadata-for-analytics">
          <name>Preserving Metadata for Analytics</name>
          <t>Organizations requiring network metadata for analytics have two options:</t>
          <ol spacing="normal" type="1"><li>
              <t>Use <tt>ipcrypt-pfx</tt> to preserve network structure within the encrypted addresses, enabling network-level analysis while keeping actual network identities encrypted.</t>
            </li>
            <li>
              <t>For non-prefix-preserving modes (<tt>ipcrypt-deterministic</tt>, <tt>ipcrypt-nd</tt>, <tt>ipcrypt-ndx</tt>), extract and store metadata (geographic location, ASN, network classification) as separate fields before encryption.</t>
            </li>
          </ol>
          <t>Both approaches provide advantages over IP address truncation, which provides inconsistent protection and irreversibly destroys data.</t>
          <t>Recommended approach:
1. Extract metadata (geographic location, ASN, network type) from the original IP address
2. Store this information as separate fields alongside the encrypted IP address
3. Apply appropriate privacy-preserving aggregation to the metadata itself</t>
          <t>Example storage schema:
~~~
{
  “encrypted_ip”: “bde9:6789:d353:824c:d7c6:f58a:6bd2:26eb”,
  “country”: “US”,
  “asn”: 15169,
  “network_type”: “cloud_provider”
}
~~~</t>
        </section>
      </section>
    </section>
    <section anchor="prefix-preserving-encryption">
      <name>Prefix-Preserving Encryption</name>
      <t>Prefix-preserving encryption maintains network structure in encrypted IP addresses. Addresses from the same network produce encrypted addresses that share a common prefix, enabling privacy-preserving network analytics while preventing identification of specific networks or users.</t>
      <t>Unlike standard encryption that completely scrambles addresses, prefix-preserving encryption enables network operators to:</t>
      <ul spacing="normal">
        <li>
          <t>Detect traffic patterns from common networks without knowing which specific networks</t>
        </li>
        <li>
          <t>Perform network-level rate limiting on encrypted addresses</t>
        </li>
        <li>
          <t>Implement DDoS mitigation while preserving user privacy</t>
        </li>
        <li>
          <t>Analyze network topology without accessing raw IP addresses</t>
        </li>
      </ul>
      <t>This mode balances privacy with analytical capability: individual addresses remain encrypted and network identities are cryptographically transformed, but network relationships remain visible through shared encrypted prefixes.</t>
      <section anchor="prefix-preserving-construction">
        <name>Prefix-Preserving Construction</name>
        <t>The encryption process achieves prefix preservation through a bit-by-bit transformation that maintains consistency across addresses with shared prefixes. For any two IP addresses sharing the first N bits, their encrypted forms also share the first N bits. This property holds recursively for all prefix lengths.</t>
        <t>The algorithm operates as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>Process each bit position sequentially from most significant to least significant</t>
          </li>
          <li>
            <t>For each bit position, extract the prefix (all bits processed so far) from the original IP address</t>
          </li>
          <li>
            <t>Apply a pseudorandom function (PRF) that takes the padded prefix as input to generate a cipher bit</t>
          </li>
          <li>
            <t>XOR the cipher bit with the original bit at the current position to produce the encrypted bit</t>
          </li>
          <li>
            <t>The encrypted bit depends deterministically on the prefix from the original IP, ensuring identical prefixes always produce identical encrypted prefixes</t>
          </li>
        </ol>
        <t>This construction ensures:</t>
        <ul spacing="normal">
          <li>
            <t>Identical prefixes always produce identical transformations for subsequent bits</t>
          </li>
          <li>
            <t>Different prefixes produce cryptographically distinct transformations</t>
          </li>
          <li>
            <t>The transformation is deterministic yet cryptographically secure</t>
          </li>
          <li>
            <t>Network relationships are preserved while actual network identities remain encrypted</t>
          </li>
        </ul>
        <t>The algorithm maintains native address sizes: IPv4 addresses remain 4 bytes (32 bits) and IPv6 addresses remain 16 bytes (128 bits).</t>
      </section>
      <section anchor="concrete-instantiation-ipcrypt-pfx">
        <name>Concrete Instantiation: ipcrypt-pfx</name>
        <t>The <tt>ipcrypt-pfx</tt> instantiation implements prefix-preserving encryption using a pseudorandom function based on the XOR of two independently keyed AES-128 encryptions.</t>
        <section anchor="pseudorandom-function-construction">
          <name>Pseudorandom Function Construction</name>
          <t>The pseudorandom function requires a 32-byte key split into two independent 16-byte AES-128 keys (<tt>K1</tt> and <tt>K2</tt>). For each bit position, the algorithm performs:</t>
          <ol spacing="normal" type="1"><li>
              <t>Padding: The prefix (all bits processed so far from the original IP address) is padded to 128 bits using the format <tt>zeros || 1 || prefix_bits</tt>, where:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The prefix bits are extracted from the most significant bits of the original IP address</t>
                </li>
                <li>
                  <t>A single <tt>1</tt> bit serves as a delimiter at position <tt>prefix_len_bits</tt></t>
                </li>
                <li>
                  <t>The prefix bits are placed immediately after the delimiter, from high to low positions</t>
                </li>
                <li>
                  <t>For an empty prefix (processing the first bit), this produces a block with only a single <tt>1</tt> bit at position 0</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Dual Encryption: The padded prefix is encrypted independently with both <tt>K1</tt> and <tt>K2</tt>, producing two 128-bit outputs (<tt>e1</tt> and <tt>e2</tt>).</t>
            </li>
            <li>
              <t>XOR Combination: The final PRF output is computed as <tt>e = e1 ⊕ e2</tt>.</t>
            </li>
          </ol>
        </section>
        <section anchor="bit-encryption-process">
          <name>Bit Encryption Process</name>
          <t>For each bit position (processing from MSB to LSB):</t>
          <ol spacing="normal" type="1"><li>
              <t>Pad the prefix (bits processed so far from the original IP) to 128 bits</t>
            </li>
            <li>
              <t>Compute the PRF output using the padded prefix: <tt>e = AES(K1, padded_prefix) ⊕ AES(K2, padded_prefix)</tt></t>
            </li>
            <li>
              <t>Extract the least significant bit from the PRF output as the cipher bit</t>
            </li>
            <li>
              <t>XOR the cipher bit with the original bit at the current position to produce the encrypted bit</t>
            </li>
          </ol>
          <t>Complete pseudocode implementation is provided in <xref target="prefix-preserving-encryption-ipcrypt-pfx"/>.</t>
        </section>
        <section anchor="key-requirements">
          <name>Key Requirements</name>
          <t>The two 16-byte halves of the 32-byte key (<tt>K1</tt> and <tt>K2</tt>) MUST NOT be identical. Using identical values for <tt>K1</tt> and <tt>K2</tt> (e.g., repeating the same 16 bytes twice) causes the XOR operation to cancel out, returning the original IP address unchanged.</t>
          <t>When the 32-byte key is randomly sampled from a uniform distribution, the probability that <tt>K1 = K2</tt> is statistically negligible.</t>
        </section>
        <section anchor="security-properties">
          <name>Security Properties</name>
          <t>The <tt>ipcrypt-pfx</tt> construction improves upon earlier designs such as CRYPTO-Pan through enhanced cryptographic security:</t>
          <ul spacing="normal">
            <li>
              <t>Sum-of-Permutations: The XOR of two independently keyed AES-128 permutations provides security beyond the birthday bound <xref target="SUM-OF-PRPS"/>, supporting more than 2<sup>78</sup> distinct IP addresses per key <xref target="REVISITING-SUM"/>. This construction ensures that even with billions of encrypted addresses, security remains robust.</t>
            </li>
            <li>
              <t>Prefix-Based Context Isolation: Each bit depends on the entire prefix history.</t>
            </li>
          </ul>
          <t>Note: Prefix-preserving encryption intentionally reveals network structure to enable analytics. Organizations requiring complete address obfuscation should use non-prefix-preserving modes.</t>
        </section>
        <section anchor="implementation-considerations">
          <name>Implementation Considerations</name>
          <t>Key implementation characteristics:</t>
          <ul spacing="normal">
            <li>
              <t>Computational Requirements:
              </t>
              <ul spacing="normal">
                <li>
                  <t>IPv4: 64 AES-128 operations per address (2 encryptions × 32 bits)</t>
                </li>
                <li>
                  <t>IPv6: 256 AES-128 operations per address (2 encryptions × 128 bits)</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Performance Optimizations:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Caching encrypted prefix values (<tt>e1</tt> and <tt>e2</tt>) significantly improves performance for addresses sharing common prefixes</t>
                </li>
                <li>
                  <t>The encryption algorithm is inherently parallelizable since AES computations for different bit positions are independent</t>
                </li>
                <li>
                  <t>The padded prefix computation can be optimized by maintaining state across iterations: instead of recomputing the padded prefix from scratch for each bit position, implementations can shift the previous padded prefix left by one bit and insert the next input bit.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="non-deterministic-encryption">
      <name>Non-Deterministic Encryption</name>
      <t>Non-deterministic encryption enhances privacy by ensuring that the same IP address produces different ciphertexts each time it is encrypted, preventing correlation attacks that plague deterministic schemes. This is achieved through tweakable block ciphers that incorporate random values called tweaks.</t>
      <t>Non-deterministic encryption is appropriate when:</t>
      <ul spacing="normal">
        <li>
          <t>Preventing correlation of the same IP address across records is critical</t>
        </li>
        <li>
          <t>Storage can accommodate the additional tweak data (8-16 bytes)</t>
        </li>
        <li>
          <t>Stronger privacy guarantees than deterministic encryption provides are required</t>
        </li>
        <li>
          <t>Processing the same address multiple times without revealing repetition patterns</t>
        </li>
      </ul>
      <t>Implementation details are provided in <xref target="implementation-details"/>.</t>
      <section anchor="encryption-process">
        <name>Encryption Process</name>
        <t>Encryption process for non-deterministic modes:</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, enabling its use for decryption.</t>
      </section>
      <section anchor="decryption-process">
        <name>Decryption Process</name>
        <t>Decryption process:</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. 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 apply per cryptographic key; rotating keys extends 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 text representation, the binary output MUST be encoded (e.g., hexadecimal or Base64). Implementations SHOULD document their chosen encoding method.</t>
      </section>
      <section anchor="concrete-instantiations">
        <name>Concrete Instantiations</name>
        <t>This document defines two concrete instantiations:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ipcrypt-nd</tt>: 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><tt>ipcrypt-ndx</tt>: 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>Test vectors are provided in <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. Implementation details are provided in <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 after about 2<sup>32</sup> operations (approximately 4 billion). An <tt>(input, tweak)</tt> collision indicates repetition without revealing the input’s value.</t>
          <t>These collision bounds apply per cryptographic key. Regular key rotation can extend secure usage beyond these bounds. The effective security is determined by the underlying block cipher’s strength.</t>
          <t>Test vectors are provided in <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 single-block AES-XTS, independent sampling of a 16-byte tweak results in an expected collision after about 2<sup>64</sup> operations (approximately 18 quintillion).</t>
          <t>Similar to <tt>ipcrypt-nd</tt>, collisions reveal repetition without compromising the input value. These limits are per key, and regular key rotation extends secure usage. The effective security is governed by AES-128 strength (approximately 2<sup>128</sup> operations).</t>
        </section>
        <section anchor="comparison-of-modes">
          <name>Comparison of Modes</name>
          <t>Mode selection depends on specific privacy requirements and operational constraints:</t>
          <ul spacing="normal">
            <li>
              <t>Deterministic (<tt>ipcrypt-deterministic</tt>):
              </t>
              <ul spacing="normal">
                <li>
                  <t>Output size: 16 bytes (most compact)</t>
                </li>
                <li>
                  <t>Privacy: Same IP always produces same ciphertext (allows correlation)</t>
                </li>
                <li>
                  <t>Use case: When duplicate identification is needed or when format preservation is critical</t>
                </li>
                <li>
                  <t>Performance: Fastest (single AES operation)</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Prefix-Preserving (<tt>ipcrypt-pfx</tt>):
              </t>
              <ul spacing="normal">
                <li>
                  <t>Output size: 4 bytes for IPv4, 16 bytes for IPv6 (maintains native sizes)</t>
                </li>
                <li>
                  <t>Privacy: Preserves network prefix relationships while encrypting actual network identities</t>
                </li>
                <li>
                  <t>Use case: Network analytics, traffic pattern analysis, subnet monitoring, DDoS mitigation</t>
                </li>
                <li>
                  <t>Performance: Bit-by-bit processing (64 AES operations for IPv4, 256 for IPv6)</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Non-Deterministic <tt>ipcrypt-nd</tt> (KIASU-BC):
              </t>
              <ul spacing="normal">
                <li>
                  <t>Output size: 24 bytes (16-byte ciphertext + 8-byte tweak)</t>
                </li>
                <li>
                  <t>Privacy: Same IP produces different ciphertexts (prevents most correlation)</t>
                </li>
                <li>
                  <t>Use case: General privacy protection with reasonable storage overhead</t>
                </li>
                <li>
                  <t>Collision resistance: Approximately 4 billion operations per key</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Non-Deterministic <tt>ipcrypt-ndx</tt> (AES-XTS):
              </t>
              <ul spacing="normal">
                <li>
                  <t>Output size: 32 bytes (16-byte ciphertext + 16-byte tweak)</t>
                </li>
                <li>
                  <t>Privacy: Same IP produces different ciphertexts (prevents correlation)</t>
                </li>
                <li>
                  <t>Use case: Maximum privacy protection when storage permits</t>
                </li>
                <li>
                  <t>Collision resistance: Approximately 18 quintillion operations per key</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="alternatives-to-random-tweaks">
        <name>Alternatives to Random Tweaks</name>
        <t>While this specification recommends uniformly random tweaks for non-deterministic encryption, alternative approaches may be considered:</t>
        <ul spacing="normal">
          <li>
            <t>Monotonic Counter: 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>UUIDs: 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 presents considerations with random tweaks, random tweaks remain the recommended approach for practical deployments.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The methods specified in this document provide strong confidentiality guarantees but explicitly do not provide integrity protection:</t>
      <t>These methods provide protection against:</t>
      <ul spacing="normal">
        <li>
          <t>Unauthorized parties learning the original IP addresses (without the key)</t>
        </li>
        <li>
          <t>Statistical analysis revealing patterns in network traffic (non-deterministic modes)</t>
        </li>
        <li>
          <t>Brute-force attacks on the address space (128-bit security level)</t>
        </li>
      </ul>
      <t>These methods do not provide protection against:</t>
      <ul spacing="normal">
        <li>
          <t>Active attackers modifying, reordering, or removing encrypted addresses</t>
        </li>
        <li>
          <t>Authorized key holders decrypting addresses (by design)</t>
        </li>
        <li>
          <t>Traffic analysis based on volume and timing (metadata)</t>
        </li>
      </ul>
      <t>Applications requiring integrity protection must additionally employ authentication mechanisms such as HMAC, authenticated encryption modes, or digital signatures over the encrypted data.</t>
      <section anchor="deterministic-mode-security">
        <name>Deterministic Mode Security</name>
        <t>A permutation ensures distinct inputs yield distinct outputs. Repeated inputs result in identical ciphertexts, revealing repetition.</t>
        <t>This makes deterministic encryption suitable for applications where format preservation is required and linkability 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. An <tt>(input, tweak)</tt> collision reveals only that the same input was processed with that tweak, not the input’s value.</t>
        <t>Security is determined by the underlying block cipher (≈2<sup>128</sup> 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>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-details">
      <name>Implementation Details</name>
      <t>This section provides pseudocode and implementation guidance for the operations described in this document.</t>
      <t>In the pseudocode throughout this document, the notation “for i from x to y” indicates iteration starting at x (inclusive) and ending before y (exclusive). For example, “for i from 0 to 4” processes values 0, 1, 2, and 3, but not 4.</t>
      <section anchor="diagrams">
        <name>Visual Diagrams</name>
        <t>The following diagrams illustrate the processes described in this specification.</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="prefix-preserving-encryption-flow-ipcrypt-pfx">
          <name>Prefix-Preserving Encryption Flow (ipcrypt-pfx)</name>
          <artwork><![CDATA[
            IP Address
                |
                v
       [Convert to 16 Bytes]
                |
                v
  [Split 32-byte key into K1, K2]
                |
                v
  [For each bit position (MSB to LSB):
  - Pad current prefix to 128 bits:
    zeros || 1 || prefix_bits
  - e1 = AES(K1, padded_prefix)
  - e2 = AES(K2, padded_prefix)
  - e = e1 ⊕ e2
  - Extract LSB from e as cipher_bit
  - XOR cipher_bit with original bit
  - Set result bit in encrypted output
  - Add original bit to prefix for next iteration]
                |
                v
       Encrypted IP Address
  (4 bytes for IPv4, 16 bytes for IPv6)
]]></artwork>
        </section>
        <section anchor="non-deterministic-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="non-deterministic-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="ipv4-address-conversion">
        <name>IPv4 Address Conversion</name>
        <t>See <xref target="ipv4-address-conversion-diagram"/> for a diagram of this process.</t>
        <sourcecode type="pseudocode"><![CDATA[
function ipv4_to_16_bytes(ipv4_address):
    // Parse the IPv4 address into 4 octets
    octets = parseIPv4(ipv4_address)  // Returns 4 octets
    // 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 octet in octets:
         bytes16.append(octet)
    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 ipv6_to_16_bytes(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 <tt>{0x20, 0x01, 0x0d, 0xb8, ..., 0x34}</tt>.</t>
      </section>
      <section anchor="conversion-from-a-16-byte-array-to-an-ip-address-string">
        <name>Conversion from a 16-Byte Array to an IP Address String</name>
        <t>This function converts a 16-byte array back to an IP address string. For IPv6 addresses, the output conforms to <xref target="RFC5952"/>. Implementers SHOULD use existing IP address formatting functions from standard libraries.</t>
        <sourcecode type="pseudocode"><![CDATA[
function bytes_16_to_ip(bytes16):
    if length(bytes16) != 16:
         raise Error("Invalid byte array")

    // Check for the IPv4-mapped prefix
    // When an IPv4-mapped IPv6 address (::ffff:x.x.x.x) is detected,
    // it is converted back to IPv4 format. This is expected
    // behavior as IPv4 addresses are internally represented as IPv4-mapped
    // IPv6 addresses for uniform processing.
    ipv4_mapped_prefix = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF]
    if bytes16[0..12] == ipv4_mapped_prefix:
         // Convert the 4 last bytes to an IPv4 address
         ipv4_parts = []
         for i from 12 to 16:
             ipv4_parts.append(integer_to_string(bytes16[i]))
         ipv4_address = join(ipv4_parts, ".")
         return ipv4_address
    else:
         // Convert the 16 bytes to an IPv6 address with canonical representation
         words = []
         for i from 0 to 8:
             word = (bytes16[i*2] << 8) | bytes16[i*2+1]
             words.append(word)

         // Find longest run of consecutive zeros for compression
         best_run_start = -1
         best_run_length = 0
         run_start = -1

         for i from 0 to 8:
             if words[i] == 0:
                 if run_start == -1:
                     run_start = i
             else:
                 if run_start != -1:
                     run_length = i - run_start
                     if run_length > best_run_length:
                         best_run_start = run_start
                         best_run_length = run_length
                     run_start = -1

         // Check final run
         if run_start != -1:
             run_length = 8 - run_start
             if run_length > best_run_length:
                 best_run_start = run_start
                 best_run_length = run_length

         // Build IPv6 string with zero compression
         parts = []
         i = 0
         while i < 8:
             if best_run_length > 1 and i == best_run_start:
                 // Insert :: for compressed zeros
                 parts.append("" if i == 0 else ":")
                 parts.append("")
                 i += best_run_length
             else:
                 parts.append(format_hex(words[i]))
                 i += 1

         return join(parts, ":")
]]></sourcecode>
      </section>
      <section anchor="deterministic-encryption-ipcrypt-deterministic">
        <name>Deterministic Encryption (ipcrypt-deterministic)</name>
        <section anchor="encryption">
          <name>Encryption</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 = convert_to_16_bytes(ip_address)
    ciphertext = AES128_encrypt(key, bytes16)
    encrypted_ip = bytes_16_to_ip(ciphertext)
    return encrypted_ip
]]></sourcecode>
        </section>
        <section anchor="decryption">
          <name>Decryption</name>
          <sourcecode type="pseudocode"><![CDATA[
function ipcrypt_deterministic_decrypt(encrypted_ip, key):
    if length(key) != 16:
        raise Error("Key must be 16 bytes")

    bytes16 = convert_to_16_bytes(encrypted_ip)
    plaintext = AES128_decrypt(key, bytes16)
    original_ip = bytes_16_to_ip(plaintext)
    return original_ip
]]></sourcecode>
        </section>
      </section>
      <section anchor="prefix-preserving-encryption-ipcrypt-pfx">
        <name>Prefix-Preserving Encryption (ipcrypt-pfx)</name>
        <section anchor="encryption-1">
          <name>Encryption</name>
          <sourcecode type="pseudocode"><![CDATA[
function ipcrypt_pfx_encrypt(ip_address, key):
    // The key MUST be exactly 32 bytes (256 bits)
    if length(key) != 32:
        raise Error("Key must be 32 bytes")

    // Convert IP to 16-byte representation
    bytes16 = convert_to_16_bytes(ip_address)

    // Split the key into two AES-128 keys
    // IMPORTANT: K1 and K2 MUST be different
    K1 = key[0:16]
    K2 = key[16:32]

    // Initialize encrypted result with zeros
    encrypted = [0] * 16

    // If we encrypt an IPv4 address, start where the IPv4 address starts (bit 96)
    // Note the first 12 bytes of bytes16 are already set to the prefix for IPv4 mapping in that case
    // This provides domain separation between an IPv4 address and the first 32 bits of an IPv6 address
    if is_ipv4(ip_address):
        prefix_start = 96
        // Set up the IPv4-mapped IPv6 prefix
        encrypted[10] = 0xFF
        encrypted[11] = 0xFF
    else:
        prefix_start = 0

    // Initialize padded_prefix for the starting prefix length
    padded_prefix = pad_prefix(bytes16, prefix_start)

    // Process each bit position sequentially
    // Note: prefix_len_bits represents how many bits from the MSB have been processed
    // Range is [prefix_start, 128), i.e., up to but not including 128
    for prefix_len_bits from prefix_start to 128:
        // Compute pseudorandom function with dual AES encryption
        e1 = AES128_encrypt(K1, padded_prefix)
        e2 = AES128_encrypt(K2, padded_prefix)
        e = e1 ⊕ e2
        // Output of the pseudorandom function is the least significant bit of e
        cipher_bit = get_bit(e, 0)

        // Encrypt the current bit position (processing from MSB to LSB)
        // For IPv6: prefix_len_bits=0 encrypts bit 127, prefix_len_bits=1 encrypts bit 126, etc.
        // For IPv4: prefix_len_bits=96 encrypts bit 31, prefix_len_bits=97 encrypts bit 30, etc.
        bit_pos = 127 - prefix_len_bits
        original_bit = get_bit(bytes16, bit_pos)
        set_bit(encrypted, bit_pos, cipher_bit ^ original_bit)

        // Prepare padded_prefix for next iteration
        // Shift left by 1 bit and insert the next bit from bytes16
        padded_prefix = shift_left_one_bit(padded_prefix)
        set_bit(padded_prefix, 0, original_bit)

    // Convert back to IP format
    return bytes_16_to_ip(encrypted)
]]></sourcecode>
        </section>
        <section anchor="decryption-1">
          <name>Decryption</name>
          <sourcecode type="pseudocode"><![CDATA[
function ipcrypt_pfx_decrypt(encrypted_ip, key):
    // The key MUST be exactly 32 bytes (256 bits)
    if length(key) != 32:
        raise Error("Key must be 32 bytes")

    // Convert encrypted IP to 16-byte representation
    encrypted_bytes = convert_to_16_bytes(encrypted_ip)

    // Split the key into two AES-128 keys
    K1 = key[0:16]
    K2 = key[16:32]

    // Initialize decrypted result with zeros
    decrypted = [0] * 16

    // If we decrypt an IPv4 address, start where the IPv4 address starts (bit 96)
    if is_ipv4(encrypted_ip):
        prefix_start = 96
        // Set up the IPv4-mapped IPv6 prefix
        decrypted[10] = 0xFF
        decrypted[11] = 0xFF
    else:
        prefix_start = 0

    // Initialize padded_prefix for the starting prefix length
    padded_prefix = pad_prefix(decrypted, prefix_start)

    // Process each bit position sequentially
    // Note: prefix_len_bits represents how many bits from the MSB have been processed
    // Range is [prefix_start, 128), i.e., up to but not including 128
    for prefix_len_bits from prefix_start to 128:
        // Compute pseudorandom function with dual AES encryption
        e1 = AES128_encrypt(K1, padded_prefix)
        e2 = AES128_encrypt(K2, padded_prefix)
        // e is expected to be the same as during encryption since the prefix is the same
        e = e1 ⊕ e2
        // Output of the pseudorandom function is the least significant bit of e
        cipher_bit = get_bit(e, 0)

        // Decrypt the current bit position (processing from MSB to LSB)
        // For IPv6: prefix_len_bits=0 decrypts bit 127, prefix_len_bits=1 decrypts bit 126, etc.
        // For IPv4: prefix_len_bits=96 decrypts bit 31, prefix_len_bits=97 decrypts bit 30, etc.
        bit_pos = 127 - prefix_len_bits
        encrypted_bit = get_bit(encrypted_bytes, bit_pos)
        original_bit = cipher_bit ^ encrypted_bit
        set_bit(decrypted, bit_pos, original_bit)

        // Prepare padded_prefix for next iteration
        // Shift left by 1 bit and insert the next bit from decrypted
        padded_prefix = shift_left_one_bit(padded_prefix)
        set_bit(padded_prefix, 0, original_bit)

    // Convert back to IP format
    return bytes_16_to_ip(decrypted)
]]></sourcecode>
        </section>
        <section anchor="helper-functions">
          <name>Helper Functions</name>
          <t>The following helper functions are used in the <tt>ipcrypt-pfx</tt> implementation:</t>
          <sourcecode type="pseudocode"><![CDATA[
function is_ipv4(ip_address):
    // Check if the IP address is IPv4 based on its byte length
    // IPv4 addresses are 4 bytes, IPv6 addresses are 16 bytes
    return length(ip_address) == 4

function get_bit(data, position):
    // Extract bit at position from 16-byte array representing an IPv6 address in network byte order
    // position: 0 = LSB of byte 15, 127 = MSB of byte 0
    // Example: position 127 refers to bit 7 (MSB) of data[0]
    // Example: position 0 refers to bit 0 (LSB) of data[15]
    byte_index = 15 - (position / 8)
    bit_index = position % 8
    return (data[byte_index] >> bit_index) & 1

function set_bit(data, position, value):
    // Set bit at position in 16-byte array representing an IPv6 address in network byte order
    // position: 0 = LSB of byte 15, 127 = MSB of byte 0
    byte_index = 15 - (position / 8)
    bit_index = position % 8
    data[byte_index] |= ((value & 1) << bit_index)

function pad_prefix(data, prefix_len_bits):
    // Specialized for the only two cases used: 0 and 96
    // For prefix_len_bits=0: Returns a block with only bit 0 set (position 0 = LSB of byte 15)
    // For prefix_len_bits=96: Returns the IPv4-mapped prefix with separator at position 96

    if prefix_len_bits == 0:
        // For IPv6 addresses starting from bit 0
        padded_prefix = [0] * 16
        padded_prefix[15] = 0x01  // Set bit at position 0 (LSB of byte 15)
        return padded_prefix

    else if prefix_len_bits == 96:
        // For IPv4 addresses, always returns the same value since all IPv4 addresses
        // share the same IPv4-mapped prefix (00...00 ffff)
        padded_prefix = [0] * 16
        padded_prefix[3] = 0x01   // Set separator bit at position 96 (bit 0 of byte 3)
        padded_prefix[14] = 0xFF  // IPv4-mapped prefix
        padded_prefix[15] = 0xFF  // IPv4-mapped prefix
        return padded_prefix

    else:
        raise Error("pad_prefix only supports prefix_len_bits of 0 or 96")

function shift_left_one_bit(data):
    // Shift a 16-byte array one bit to the left
    // The most significant bit is lost, and a zero bit is shifted in from the right
    result = [0] * 16
    carry = 0

    // Process from least significant byte (byte 15) to most significant byte (byte 0)
    for i from 15 down to 0:
        // Current byte shifted left by 1, with carry from previous byte
        result[i] = ((data[i] << 1) | carry) & 0xFF
        // Extract the bit that will be carried to the next byte
        carry = (data[i] >> 7) & 1

    return result
]]></sourcecode>
        </section>
      </section>
      <section anchor="non-deterministic-encryption-using-kiasu-bc-ipcrypt-nd">
        <name>Non-Deterministic Encryption using KIASU-BC (ipcrypt-nd)</name>
        <section anchor="encryption-2">
          <name>Encryption</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 = convert_to_16_bytes(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
]]></sourcecode>
        </section>
        <section anchor="decryption-2">
          <name>Decryption</name>
          <sourcecode type="pseudocode"><![CDATA[
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 = bytes_16_to_ip(bytes16)
    return ip_address
]]></sourcecode>
        </section>
      </section>
      <section anchor="non-deterministic-encryption-using-aes-xts-ipcrypt-ndx">
        <name>Non-Deterministic Encryption using AES-XTS (ipcrypt-ndx)</name>
        <section anchor="encryption-3">
          <name>Encryption</name>
          <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 = convert_to_16_bytes(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
]]></sourcecode>
        </section>
        <section anchor="decryption-3">
          <name>Decryption</name>
          <sourcecode type="pseudocode"><![CDATA[
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 = bytes_16_to_ip(bytes16)
    return ip_address
]]></sourcecode>
        </section>
        <section anchor="helper-functions-for-aes-xts">
          <name>Helper Functions for AES-XTS</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

function AES_XTS_decrypt(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)

    // Decrypt the block: AES128_decrypt(block ⊕ ET, K1) ⊕ ET
    return AES128_decrypt(K1, block ⊕ ET) ⊕ ET
]]></sourcecode>
        </section>
      </section>
      <section anchor="implementing-kiasu-bc">
        <name>KIASU-BC Implementation Guide</name>
        <t>This section provides a guide for implementing the KIASU-BC tweakable block cipher used in <tt>ipcrypt-nd</tt>.</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.</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>SubBytes: Apply the AES S-box to each byte of the state</t>
            </li>
            <li>
              <t>ShiftRows: Rotate each row of the state matrix</t>
            </li>
            <li>
              <t>MixColumns: Mix the columns of the state matrix (except in the final round)</t>
            </li>
            <li>
              <t>AddRoundKey: XOR the state with the round key and padded tweak</t>
            </li>
          </ol>
          <t>Details about these operations are provided in <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>Key Expansion:
              </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>Tweak Processing:
              </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>Encryption Process:
              </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, 4):
        padded[i*4]   = tweak[i*2]
        padded[i*4+1] = tweak[i*2+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>
          <t>Key and tweak sizes for each variant:</t>
          <ul spacing="normal">
            <li>
              <t><tt>ipcrypt-deterministic</tt>: Key: 16 bytes (128 bits), no tweak, Output: 16 bytes</t>
            </li>
            <li>
              <t><tt>ipcrypt-pfx</tt>: Key: 32 bytes (256 bits, split into two independent AES-128 keys), no external tweak (uses prefix as cryptographic context), Output: 4 bytes for IPv4, 16 bytes for IPv6</t>
            </li>
            <li>
              <t><tt>ipcrypt-nd</tt>: Key: 16 bytes (128 bits), Tweak: 8 bytes (64 bits), Output: 24 bytes</t>
            </li>
            <li>
              <t><tt>ipcrypt-ndx</tt>: Key: 32 bytes (256 bits, split into two AES-128 keys), Tweak: 16 bytes (128 bits), Output: 32 bytes</t>
            </li>
          </ul>
        </section>
      </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"/>.</t>
      <t>Multiple independent, interoperable implementations have been developed and include Awk, C, D, Dart, Elixir, Go, Java, JavaScript, Kotlin, PHP, Python, Ruby, Rust, Swift, and Zig.</t>
      <t>A comprehensive list of implementations and their test results is available 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="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>
  </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="FAST" target="https://eprint.iacr.org/2021/1171">
          <front>
            <title>FAST: Format-Preserving Encryption via Shortened AES Tweakable Block Cipher</title>
            <author initials="Y." surname="Doh">
              <organization/>
            </author>
            <author initials="J." surname="Ha">
              <organization/>
            </author>
            <author initials="J." surname="Kim">
              <organization/>
            </author>
            <date year="2021" month="September" day="12"/>
          </front>
          <seriesInfo name="Cryptology ePrint Archive" value="Report 2021/1171"/>
        </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="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="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="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="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="RFC5952">
          <front>
            <title>A Recommendation for IPv6 Address Text Representation</title>
            <author fullname="S. Kawamura" initials="S." surname="Kawamura"/>
            <author fullname="M. Kawashima" initials="M." surname="Kawashima"/>
            <date month="August" year="2010"/>
            <abstract>
              <t>As IPv6 deployment increases, there will be a dramatic increase in the need to use IPv6 addresses in text. While the IPv6 address architecture in Section 2.2 of RFC 4291 describes a flexible model for text representation of an IPv6 address, this flexibility has been causing problems for operators, system engineers, and users. This document defines a canonical textual representation format. It does not define a format for internal storage, such as within an application or database. It is expected that the canonical format will be followed by humans and systems when representing IPv6 addresses as text, but all implementations must accept and be able to handle any legitimate RFC 4291 format. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5952"/>
          <seriesInfo name="DOI" value="10.17487/RFC5952"/>
        </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="SUM-OF-PRPS" target="https://link.springer.com/chapter/10.1007/3-540-45539-6_34">
          <front>
            <title>The Sum of PRPs Is a Secure PRF</title>
            <author initials="S." surname="Lucks">
              <organization/>
            </author>
            <date year="2000"/>
          </front>
          <seriesInfo name="EUROCRYPT" value="2000"/>
        </reference>
        <reference anchor="REVISITING-SUM" target="https://eprint.iacr.org/2021/840">
          <front>
            <title>Revisiting the Indifferentiability of the Sum of Permutations</title>
            <author initials="A." surname="Bhattacharjee">
              <organization/>
            </author>
            <author initials="A." surname="Dutta">
              <organization/>
            </author>
            <author initials="E." surname="List">
              <organization/>
            </author>
            <author initials="M." surname="Nandi">
              <organization/>
            </author>
            <date year="2021"/>
          </front>
          <seriesInfo name="CRYPTO" value="2021"/>
        </reference>
        <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/ipcrypt-std/ipcrypt2">
          <front>
            <title>ipcrypt2: IP address encryption/obfuscation tool</title>
            <author initials="F." surname="Denis">
              <organization/>
            </author>
            <date year="2025"/>
          </front>
        </reference>
        <reference anchor="RSSAC040" target="https://www.icann.org/en/system/files/files/rssac-040-09mar21-en.pdf">
          <front>
            <title>RSSAC040: Recommendations on Anonymization Processes for Source IP Addresses Submitted for Future Analysis</title>
            <author initials="" surname="ICANN RSSAC">
              <organization/>
            </author>
            <date year="2021" month="March" day="09"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 1328?>

<section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This appendix provides test vectors for the ipcrypt variants. Each test vector includes the key, input IP address, and encrypted output. Non-deterministic variants include the tweak value.</t>
      <t>Implementations MUST verify their correctness against these test vectors before deployment.</t>
      <section anchor="ipcrypt-deterministic-test-vectors">
        <name>ipcrypt-deterministic Test Vectors</name>
        <sourcecode type="test-vectors"><![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
]]></sourcecode>
      </section>
      <section anchor="ipcrypt-pfx-test-vectors">
        <name>ipcrypt-pfx Test Vectors</name>
        <t>The following test vectors demonstrate the prefix-preserving property of ipcrypt-pfx. Addresses from the same network produce encrypted addresses that share a common encrypted prefix.</t>
        <section anchor="basic-test-vectors">
          <name>Basic Test Vectors</name>
          <sourcecode type="test-vectors"><![CDATA[
# Test vector 1 (IPv4)
Key:          0123456789abcdeffedcba98765432101032547698badcfeefcdab8967452301
Input IP:     0.0.0.0
Encrypted IP: 151.82.155.134

# Test vector 2 (IPv4)
Key:          0123456789abcdeffedcba98765432101032547698badcfeefcdab8967452301
Input IP:     255.255.255.255
Encrypted IP: 94.185.169.89

# Test vector 3 (IPv4)
Key:          0123456789abcdeffedcba98765432101032547698badcfeefcdab8967452301
Input IP:     192.0.2.1
Encrypted IP: 100.115.72.131

# Test vector 4 (IPv6)
Key:          0123456789abcdeffedcba98765432101032547698badcfeefcdab8967452301
Input IP:     2001:db8::1
Encrypted IP: c180:5dd4:2587:3524:30ab:fa65:6ab6:f88
]]></sourcecode>
        </section>
        <section anchor="prefix-preserving-test-vectors">
          <name>Prefix-Preserving Test Vectors</name>
          <t>These test vectors demonstrate the prefix-preserving property. Addresses from the same network share common encrypted prefixes at the corresponding prefix length.</t>
          <sourcecode type="test-vectors"><![CDATA[
# IPv4 addresses from same /24 network (10.0.0.0/24)
Key:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
Input IP:     10.0.0.47
Encrypted IP: 19.214.210.244

Key:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
Input IP:     10.0.0.129
Encrypted IP: 19.214.210.80

Key:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
Input IP:     10.0.0.234
Encrypted IP: 19.214.210.30

# IPv4 addresses from same /16 but different /24 networks
Key:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
Input IP:     172.16.5.193
Encrypted IP: 210.78.229.136

Key:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
Input IP:     172.16.97.42
Encrypted IP: 210.78.179.241

Key:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
Input IP:     172.16.248.177
Encrypted IP: 210.78.121.215

# IPv6 addresses from same /64 network (2001:db8::/64)
Key:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
Input IP:     2001:db8::a5c9:4e2f:bb91:5a7d
Encrypted IP: 7cec:702c:1243:f70:1956:125:b9bd:1aba

Key:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
Input IP:     2001:db8::7234:d8f1:3c6e:9a52
Encrypted IP: 7cec:702c:1243:f70:a3ef:c8e:95c1:cd0d

Key:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
Input IP:     2001:db8::f1e0:937b:26d4:8c1a
Encrypted IP: 7cec:702c:1243:f70:443c:c8e:6a62:b64d

# IPv6 addresses from same /32 but different /48 networks
Key:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
Input IP:     2001:db8:3a5c::e7d1:4b9f:2c8a:f673
Encrypted IP: 7cec:702c:3503:bef:e616:96bd:be33:a9b9

Key:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
Input IP:     2001:db8:9f27::b4e2:7a3d:5f91:c8e6
Encrypted IP: 7cec:702c:a504:b74e:194a:3d90:b047:2d1a

Key:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
Input IP:     2001:db8:d8b4::193c:a5e7:8b2f:46d1
Encrypted IP: 7cec:702c:f840:aa67:1b8:e84f:ac9d:77fb
]]></sourcecode>
        </section>
      </section>
      <section anchor="ipcrypt-nd-test-vectors">
        <name>ipcrypt-nd Test Vectors</name>
        <sourcecode type="test-vectors"><![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
]]></sourcecode>
      </section>
      <section anchor="ipcrypt-ndx-test-vectors">
        <name>ipcrypt-ndx Test Vectors</name>
        <sourcecode type="test-vectors"><![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
]]></sourcecode>
        <t>For non-deterministic variants, the tweak values shown are examples. Tweaks MUST be uniformly random for each encryption operation.</t>
      </section>
    </section>
    <section numbered="false" anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document does not require any IANA actions.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>We would like to thank the members of the IETF and the cryptographic community for their helpful comments on this work. Tobias Fiebig conducted a detailed review of this draft. Additional valuable feedback was provided by Eliot Lear. Assistance with implementation aspects was kindly provided by Wu Tingfeng.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
Z+n6fCmx+vn/BSU5600u9gAA

-->

</rfc>
