Commit 484db3
2025-02-11 11:52:28 Samuli Seppänen: -/-| /dev/null .. FAQ/327-changed-hex-bytes-in-the-static-key-the-key-still-connects-to-a-remote-peer-using-the-original-key.md | |
| @@ 0,0 1,124 @@ | |
| + | # Changed Hex Bytes in the Static Key, the Key Still Connects to a Remote Peer Using the Original Key |
| + | |
| + | **NOTE: this article is very outdated. Use of static key encryption is discouraged and deprecated. If you want something similar but more secure, look into [peer fingerprinting](https://github.com/openvpn/openvpn/blob/master/doc/man-sections/example-fingerprint.rst).** |
| + | |
| + | Source: [OpenVPN Mailing List](https://sourceforge.net/p/openvpn/mailman/message/4256045/) |
| + | |
| + | From: James Yonan <jim@yo...> - 2004-10-23 21:46:24 |
| + | |
| + | On Sat, 23 Oct 2004, Alberto Gonzalez Iniesta wrote: |
| + | > Hello James et al, |
| + | > |
| + | > I've just got a bug report at the Debian Bug Tracking System. I'm pretty sure it's bogus, but I think it's out of my knowledge to classify it as such. |
| + | > |
| + | > The bug reporter claims that he can modify almost all of the pre-shared key, and the tunnel still gets established. I'm pretty sure this has something to do with only a portion of the pre-shared key being used if no direction is specified, but I'd love if anyone could give a more thorough explanation (please Cc: 277838@... when doing so). |
| + | > |
| + | > Thanks, |
| + | > |
| + | > Alberto |
| + | > |
| + | > [1] http://bugs.debian.org/277838 |
| + | |
| + | >>When I modify the Preshared 2048 bit Static Key on the Initiator Side of the |
| + | >>Tunnel (don't tested the other way) I'm anyhow able to establish the |
| + | >>Tunnel and send Packets through the Tunnel. I don't understand |
| + | >>the Key splitting and handling as described below, but I think the Keys |
| + | >>on both Sides of the Tunnel should be identical for the Tunnel to be |
| + | >>established. |
| + | >> |
| + | >>I can modify every Char in Line 2,3,4,7,8,9,10,11,12,13,14,15,16 without |
| + | >>any effect and think this is possible a Bug. |
| + | >> |
| + | >>Bye |
| + | >>Klaus |
| + | |
| + | **Okay, see my response below.** |
| + | |
| + | No, this is not a bug. The 2048-bit static key is designed to be large enough to allow 512-bit encrypt, decrypt, HMAC send, and HMAC receive keys to be extracted from it. |
| + | |
| + | However, this key size is far too large for current conventional OpenVPN usage. OpenVPN uses the 128-bit blowfish cipher by default. It also uses the 160-bit HMAC-SHA1 as a cryptographic signature on packets to protect against tampering. Since you probably didn't specify a key direction parameter, the encrypt/decrypt keys for both directions are the same and the HMAC keys for both directions are also the same. |
| + | |
| + | That means that OpenVPN is only actually using 128 + 160 = 288 bits out of the file -- much less than the 2048 bits which are available. |
| + | |
| + | Below, I will show a sample 2048-bit OpenVPN key, bracketed to show which bits are actually used for key material, assuming default crypto settings: |
| + | |
| + | ``` |
| + | # |
| + | # 2048 bit OpenVPN static key |
| + | # |
| + | -----BEGIN OpenVPN Static key V1----- |
| + | [eac9ae92cd73c5c2d6a2338b5a22263a] -> 128 bits for cipher |
| + | 4ef4a22326d2a996e0161d25d41150c8 |
| + | 38bebc451ccf8ad19c7d1c7ce09742c3 |
| + | 2047ba60f1d97d47c88f7ab0afafb2ce |
| + | [f702cb04c7d15ff2606736c1825e830a -> 160 bits for HMAC SHA1 |
| + | 7e30a796] 4b82825d6767a04b3c8f4583 |
| + | d4928127262c3a8603776bd6da339f69 |
| + | dece3bbfee35f1dceb7cbceaef4c6933 |
| + | 2c2cef8ac550ed15213b216b825ab31e |
| + | 49840f99ff9df3c5f31156439ed6b99c |
| + | 4fc1bff417d33d77134365e38c9d71cd |
| + | e294ba6e65d51703d6d4a629d5fc618e |
| + | adddb889b8173ac79b4261328770bbbe |
| + | 74294bc79e357c82af9ef53f2968be6a |
| + | 007e6022da0a1a39f2ed5660f94a5926 |
| + | 35d72e5838dd78dd680d91f6edcf6988 |
| + | -----END OpenVPN Static key V1----- |
| + | ``` |
| + | |
| + | As you can see, the only lines actually used are 1, 5, and 6. And of course, that matches up perfectly with what you observed. |
| + | |
| + | To verify this, run OpenVPN as follows: |
| + | ``` |
| + | openvpn --dev null --verb 7 --secret key | grep 'crypt:' |
| + | ``` |
| + | where 'key' is a file containing the key shown above. |
| + | ``` |
| + | Static Encrypt: Cipher 'BF-CBC' initialized with 128 bit key |
| + | Static Encrypt: CIPHER KEY: eac9ae92 cd73c5c2 d6a2338b 5a22263a |
| + | Static Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication |
| + | Static Encrypt: HMAC KEY: f702cb04 c7d15ff2 606736c1 825e830a 7e30a796 |
| + | Static Decrypt: Cipher 'BF-CBC' initialized with 128 bit key |
| + | Static Decrypt: CIPHER KEY: eac9ae92 cd73c5c2 d6a2338b 5a22263a |
| + | Static Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication |
| + | Static Decrypt: HMAC KEY: f702cb04 c7d15ff2 606736c1 825e830a 7e30a796 |
| + | ``` |
| + | |
| + | Note that the keys which are shown in the OpenVPN output exactly match the bracketed section of the key source. |
| + | |
| + | Now if you want to use more of the key material, it is possible to use two sets of encrypt/HMAC keys, one for each direction: |
| + | ``` |
| + | openvpn --dev null --verb 7 --secret key 0 | grep 'crypt:' |
| + | ``` |
| + | (Note that the '0' after key chooses one symmetrical direction -- the opposite peer would use a '1' to choose the other direction). |
| + | ``` |
| + | Static Encrypt: Cipher 'BF-CBC' initialized with 128 bit key |
| + | Static Encrypt: CIPHER KEY: eac9ae92 cd73c5c2 d6a2338b 5a22263a |
| + | Static Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication |
| + | Static Encrypt: HMAC KEY: f702cb04 c7d15ff2 606736c1 825e830a 7e30a796 |
| + | Static Decrypt: Cipher 'BF-CBC' initialized with 128 bit key |
| + | Static Decrypt: CIPHER KEY: 2c2cef8a c550ed15 213b216b 825ab31e |
| + | Static Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication |
| + | Static Decrypt: HMAC KEY: adddb889 b8173ac7 9b426132 8770bbbe 74294bc7 |
| + | ``` |
| + | |
| + | Now notice that the Encrypt and Decrypt keys are no longer identical. The encrypt keys are drawing key material from lines 1, 5, and 6 in the key file, while the decrypt keys are drawing from lines 9, 13, and 14. |
| + | |
| + | Now the opposite peer will use a key-direction of 1: |
| + | ``` |
| + | openvpn --dev null --verb 7 --secret key 1 | grep 'crypt:' |
| + | ``` |
| + | ``` |
| + | Static Encrypt: Cipher 'BF-CBC' initialized with 128 bit key |
| + | Static Encrypt: CIPHER KEY: 2c2cef8a c550ed15 213b216b 825ab31e |
| + | Static Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication |
| + | Static Encrypt: HMAC KEY: adddb889 b8173ac7 9b426132 8770bbbe 74294bc7 |
| + | Static Decrypt: Cipher 'BF-CBC' initialized with 128 bit key |
| + | Static Decrypt: CIPHER KEY: eac9ae92 cd73c5c2 d6a2338b 5a22263a |
| + | Static Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication |
| + | Static Decrypt: HMAC KEY: f702cb04 c7d15ff2 606736c1 825e830a 7e30a796 |
| + | ``` |
| + | |
| + | Notice how the Encrypt and Decrypt keys are swapped, in relation to the key-direction 1 example. |
| + | |
| + | So you might ask why is the OpenVPN static key file so large, if such a small percentage of the bits are currently used? The answer is to accommodate future ciphers and HMAC hashes which use large keys. Changing a file format is obviously problematic from a compatibility perspective, so 2048 bits were chosen so that two sets of 512-bit encrypt and HMAC keys could be derived for two separate key directions. |
