As far as I understand, on Ethereum every wallet has a private and a public key.
The public key is the address. What I want to achieve is to SIGN a "string" with a public address, so that only that address (with the private key) can "read" the message.
I'm struggling in finding the best library to do this: I've seen openpgp and JEncrypt but both requires to have "public / private" keys specified in some particular format.
Is there any SDK that can help? With web3 is possible only to sign with private key..
The term "sign" in public-key cryptography has a very specific meaning: it generally means the generation of a digital signature to verify the content and sender of a given message.
It sounds like what you're describing when you say "SIGN" is that you want to encrypt a message with the ETH address / public key, and decrypt the message with the wallet private key.
In public key cryptography, you encrypt with the public key and decrypt with the private key.
I'm struggling in finding the best library to do this: i've seen openpgp and JEncrypt but both requires to have "public / private" keys specified in some particular format.
Public and private keys will need to be in the proper format for any pgp implementation, and this is likely the problem with ETH addresses, because the ETH address is derived from the underlying key pair. This blog post contains a detailed explanation of the relationship between ETH addresses and key pairs.