encryptHidesThePlaintextAndStripRecoversIt

Round-trip — strip(encrypt(m, k), k) == mand the secrecy floor: the ciphertext is not the plaintext.

The second half is one assertNotEquals and it is the whole of what this suite says about hiding. Without it a scheme whose encrypt returns its argument passes every property here: the round-trip inverts trivially, both commutativity properties hold because nothing moves, strip order is free, and distinctKeysProduceDistinctCiphertexts compares two keys — so one degenerate key beside one healthy key still yields differing ciphertexts and stays green. Since a card deal's entire purpose is that no player can read a card another player covered, that is the one law worth having if you may only have one.

It costs nothing: the ciphertext is already in hand for the round-trip, and this reuses the loop rather than adding a second one — deliberately, because newScheme may be SRA doing 2048-bit modular exponentiation per layer.

Reachable, not hypothetical, on the real scheme. SraScheme.generateKey rejects an exponent only when gcd(e, p-1) != 1, which admits e = 1 — the identity. That an astronomically-improbable draw is needed to hit it is a property of the CSPRNG, not of the check, and a scheme's key generator is exactly the kind of code a later optimisation edits.

Mutation receipt. Making SraScheme.encrypt/strip return their argument reds the first assertion here and leaves the second green — the round-trip cannot see an identity scheme at all. But so does making only some key the identity, and this property draws one key: with generateKey degenerate on an instance's second draw it stays green, which is what generatedKeyPairsAreUsable is for.